首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >空结果集和当=1时的情况

空结果集和当=1时的情况
EN

Database Administration用户
提问于 2018-01-31 13:52:09
回答 1查看 23.8K关注 0票数 2

我很确定这是一个隐式转换,但我无法找到有关它的信息。

假设我有这个SQL:

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1 WHERE (1=1)) = 1 THEN 1 ELSE 0 END

我的子查询返回一行,因此与1相比较。这将导致我的情况是何时产生1输出。

即使我将子查询设置为不像下面的示例那样返回任何行,CASE语句也会返回0结果:

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END
  • SQL解释器是否在“空集”到0或1之间进行转换?
  • 我不喜欢用这种比较。在我看来,最好像这样使用opinion :当存在时选择CASE (选择1 WHERE (1=1)),然后选择其他0结尾

如果我不使用“存在”,会有什么好处或缺点吗?

EN

回答 1

Database Administration用户

发布于 2018-01-31 14:22:12

SQL解释器是否在“空集”到0或1之间进行转换?

不,查询没有返回0,因为空结果被认为等于0,而是因为空结果集被认为是NULL,null不等于任何东西。

当你发现

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 1 THEN 1 ELSE 0 END

返回0

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) = 0 THEN 1 ELSE 0 END

也返回0。

因此,空结果集不是1而不是0,它是空的,如

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1 WHERE (1=0)) is NULL THEN 1 ELSE 0 END

返回1。

使用该代码查看这个[医]小提琴

NULL是未知的,所以Server不知道它等于什么。

在我看来,用存在更好

如果您依赖于结果集的存在,我同意EXISTS可能是一条路。这就是建筑的目的。

如果您想在课程之外比较两个值,则需要使用CASE,但对于您所述的场景,我将使用

如果结果集有多行或多列,则比较将中断。

例如

代码语言:javascript
运行
复制
SELECT
CASE WHEN (SELECT 1,2 WHERE (1=1)) = 1 THEN 1 ELSE 0 END

返回

Msg 116 16级状态第1行第2行当子查询未引入时只能在select列表中指定一个表达式。

代码语言:javascript
运行
复制
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。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。

票数 10
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/196720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档