执行CAST时,关键字“ as”附近的语法不正确

时间:2019-09-20 10:06:58

标签: sql-server tsql casting

我正在尝试更改从SQL发出的数据的值。在SAL_ClientTypeID中通常值为4的位置,我想说“私有”。我目前遇到的错误是

  

“消息156,级别15,状态1,第3行关键字附近的语法不正确   “是”。

最初我尝试了以下方法

   CASE
       WHEN SAL_ClientTypeID = 4 THEN  'Private'
       ELSE SAL_ClientTypeID
   END, 

但是我遇到了这个错误

  

“将varchar值'Private'转换为数据时,转换失败   输入int。”

SELECT SAL_Account_Ref AS 'Account Ref',
       CASE
           WHEN SAL_ClientTypeID = 4 THEN cast (sal_clienttypeID as nvarchar(20)) as 'Private'
           ELSE SAL_ClientTypeID
       END
FROM sales;

我希望SAL_ClientTypeID = 4的输出值为“私有”

4 个答案:

答案 0 :(得分:3)

SELECT SAL_Account_Ref AS 'Account Ref',
       CASE
           WHEN SAL_ClientTypeID = 4 THEN 'Private'
           ELSE cast (sal_clienttypeID as nvarchar(20))
       END
FROM sales;

答案 1 :(得分:1)

您不能在情况下混合数据类型...尝试

SELECT SAL_Account_Ref AS 'Account Ref',
       CASE
           WHEN SAL_ClientTypeID = 4 THEN  'Private'
           ELSE CAST(SAL_ClientTypeID, as nvarchar(20))
       END
FROM sales;

答案 2 :(得分:1)

查询有两个问题:

  

信息156,级别15,状态1,第3行,关键字“ as”附近的语法错误。

来自as后跟字符串文字的情况,应在其后加上列名:

SELECT SAL_Account_Ref AS Account_Ref

第二个错误是因为您在case上返回两个数据类型-如果字符串等于4,则返回字符串int,否则,您应该使用强制转换以确保其始终相同:

SELECT SAL_Account_Ref AS Account_Ref,
       CASE
           WHEN SAL_ClientTypeID = 4 THEN 'Private'
           ELSE cast (sal_clienttypeID as nvarchar(20))
       END
FROM sales;

答案 3 :(得分:0)

tsql中有一个数据类型优先级。数字类型的优先级高于文本类型。因此,当您的case同时包含“ Private”之类的文本和SAL_ClientTypeID之类的数字类型时,该数字将被覆盖。当出现“私人”情况时,tsql尝试将其转换为数字并引发您看到的错误。

如果可以将SAL_ClientTypeID用作文本,请使用其他答案之一。否则,您将不得不重新考虑自己的规范。