IN SQL

2017-01-13 45 views
2
CASE语句
Select CASE WHEN loc ='J' THEN 'Y' 
      WHEN loc NOT IN ('J') THEN 'N' 
      ELSE 0 END AS loc FROM [prd].[dbo].[GRP] 
      EXCEPT 
Select location FROM [prd1].[dbo].[GRPO] WHERE VALUE IN('Y','N'); 

错误:IN SQL

Conversion failed when converting the varchar value 'Y' to data type int.

两者在两个表列是相同的数据类型仅(varchar)的。

+0

这是

变化0INT)到'0'String)'ELSE 0',让你的麻烦。更改为'ELSE'0''来修复错误。 – HoneyBadger

+1

这是因为你的else是一个int,所以它会将所有事情都隐式转换为int,因为所有的值必须是相同的数据类型。为什么不简单地删除其他?无论如何你都不可能得到那个代码。 –

+1

@SeanLange,如果loc loc为NULL,你可以到达ELSE# – HoneyBadger

回答

5

Case语句返回result_expression中的类型集合和可选的else_result_expression中的最高优先级类型。由于0 (INT)的优先级高于Y (Varchar),因此Y已隐式转换为INT,因此您将收到转换错误。在ELSE声明

Select CASE WHEN loc = 'J' THEN 'Y' 
      WHEN loc <> 'J' THEN 'N' -- loc NOT IN ('J') 
ELSE '0' END 
+0

你甚至不能从OP逻辑中得到其他的东西。没有任何值可以代表你='J'或不='J'。 :) –

+0

@SeanLange - 如果它是'NULL' –

+0

好点...呃。我需要再喝点咖啡。 –