我很确定这是一个隐式转换,但我无法找到有关它的信息。
假设我有这个SQL:
SELECT
CASE WHEN (SELECT 1 WHERE (1=1)) = 1 THEN 1 ELSE 0 END我的子查询返回一行,因此与1相比较。这将导致我的情况是何时产生1输出。
即使我将子查询设置为不像下面的示例那样返回任何行,CASE语句也会返回0结果:
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END如果我不使用“存在”,会有什么好处或缺点吗?
发布于 2018-01-31 14:22:12
SQL解释器是否在“空集”到0或1之间进行转换?
不,查询没有返回0,因为空结果被认为等于0,而是因为空结果集被认为是NULL,null不等于任何东西。
当你发现
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END返回0
但
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 0 THEN 1 ELSE 0 END也返回0。
因此,空结果集不是1而不是0,它是空的,如
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) is NULL THEN 1 ELSE 0 END返回1。
使用该代码查看这个[医]小提琴。
NULL是未知的,所以Server不知道它等于什么。
在我看来,用存在更好
如果您依赖于结果集的存在,我同意EXISTS可能是一条路。这就是建筑的目的。
如果您想在课程之外比较两个值,则需要使用CASE,但对于您所述的场景,我将使用
如果结果集有多行或多列,则比较将中断。
例如
SELECT
CASE WHEN (SELECT 1,2 WHERE (1=1)) = 1 THEN 1 ELSE 0 END返回
Msg 116 16级状态第1行第2行当子查询未引入时只能在select列表中指定一个表达式。
和
SELECT
CASE WHEN (SELECT 1 WHERE (1=1) UNION SELECT 2 WHERE (1=1)) = 1 THEN 1 ELSE 0 END返回
MSG512级别16状态1行1子查询返回的值超过1。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。
https://dba.stackexchange.com/questions/196720
复制相似问题