Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在SQL中理解CASE WHEN语句时遇到问题_Mysql - Fatal编程技术网

Mysql 在SQL中理解CASE WHEN语句时遇到问题

Mysql 在SQL中理解CASE WHEN语句时遇到问题,mysql,Mysql,在上面的陈述中,那么1是什么?1代表什么? 之后的值“1”如何影响输出 如果提升为或=2000,则查询将只返回1,否则它将返回NULL(这对于字段的布尔表示完全有用,因为NULL表示0), 现在返回值将设置为计数\u高海拔\u机场首先,请注意这三个表达式是等效的: SELECT state, COUNT(CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END) as count_high_elevation_aiports FRO

在上面的陈述中,那么1是什么?1代表什么? 之后的值“1”如何影响输出


如果
提升
=
2000,则查询将只返回1,否则它将返回
NULL
(这对于字段的布尔表示完全有用,因为NULL表示0),
现在返回值将设置为
计数\u高海拔\u机场
首先,请注意这三个表达式是等效的:

SELECT    state, 
    COUNT(CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END) as count_high_elevation_aiports 
FROM airports 
GROUP BY state;
如果高程>=2000,则表达式的计算结果为“1”,否则表达式的计算结果为
NULL

“1”通常用作布尔值true,您可以用等效结果替换上述表达式中的MySQL literal
true
。。。但这不是“1”的意义

COUNT()
一起使用时,在这种情况下,
1
的唯一真正意义在于它不是
NULL

这一点很重要,因为与流行的观点相反,
COUNT()
不计算行数。它计算值。

有什么区别
NULL
在技术上不是一个值。相反,它是一个表示没有值的标记,因此
COUNT(expr)
只对expr不为null的行进行计数

通过使用类似于此处的表达式,您要求服务器计算高程=>2000的行,您可以通过为不希望计算的行提供
count()
a
NULL
来完成此操作。。。和一个非空的行值

对值进行运算——而
NULL
,同样不是这种意义上的值

另一个使这一原理更加清晰的聚合函数是
AVG()
。如果你有3排。。。值为5、
NULL和10。。。平均值是多少?如果你说7.5,那是正确的:这3行的平均值是(5+10)÷2=5,因为这3行只有两个值
NULL
不是0,否则平均值将是(5+0+10)÷3=5,而不是

所以,这就是它的工作方式和原因

之后的值“1”如何影响输出

事实并非如此。您也可以很容易地说
计数(如果标高>=2000,则为“cat视频有趣”,否则为空结束)
,因为,就像文字
1
,文字字符串
'cat视频有趣”
也不是空值,非空值——任何非空值——都是计数的值

新手可能会尝试使用
计数(高程>=2000)
来完成此任务,但这给出了错误的答案,因为高程<2000的行的0(false)不是null,因此这些行仍然会被计数

然后您可能会问,“为什么不直接使用
COUNT(*)…其中高程>=2000
?”这是一个好问题。原因各不相同,但是如果您按状态分组,并且存在没有与
WHERE
匹配的行的状态,这些状态将从结果中完全消除,这通常不是您想要的。此查询包含它们,计数为零


请注意,顶部的第三个示例表达式
((高程>=2000)或NULL)
,实际上不需要括号。我之所以把它们包括进来,是因为这种形式乍一看不一定是直观的。如果简单地编写
高程>=2000或NULL
,操作的自然优先级将导致正确计算。此表达式与其他两个表达式等效,因为
elevation>=2000
首先计算为1(如果为真)、0(如果为假)或
NULL(如果高程为空)。然后计算优先级较低的
,得到以下结果之一:
1或NULL=>1
<代码>0或NULL=>NULL
NULL或NULL=>NULL
。。。在编写带有
计数(高程>=2000或NULL)的查询时,您可能会被互联网长者授予SQL向导徽章。

NULL
在这里并不“代表0”,1等同于布尔值true只是巧合。我相信您可能忽略了一个事实,即这里使用了聚合函数,或者可能忽略了其中一个含义。
CASE WHEN elevation >= 2000 THEN 1 ELSE NULL END
IF(elevation >= 2000, 1, NULL)
((elevation >= 2000) OR NULL)