这个MySQL查询如何返回NULL?

问题描述

your_event.is_set()

SET @last_nid=-1; SELECT vid,IF(@last_nid = nid,@last_status,0) AS last_status,@last_status := status AS status,@last_nid := nid AS nid FROM node_field_revision ORDER BY vid; nid都是正整数,而vid是0或1。

status如何导致last_status的问题上,我完全不知所措,但确实可以。

MySQL手册说:

如果expr1为TRUE(expr1 0和expr1 NULL),则IF()返回expr2。否则,它将返回expr3。

好吧,第一次迭代NULL不能等于@last_nid,因为一个是负数,另一个是正数。因此,返回0。是的,nid在此处为NULL,但无法返回。然后用@last_status的值@last_status填充0或1。

在进一步的迭代中,status将永远不会再为NULL。

但是,绝大多数行的@last_status都为NULL-如果我给@last_status赋一个初始值,那么那不会发生,但是再次出现,这意味着我的想法和我的查询是假的,但是为什么/如何?

解决方法

您没有初始化@last_status变量,因此服务器认为它是NULL常量。

在执行查询之前初始化所有变量,不仅是其中之一,也可以在查询中执行:

SELECT vid,IF(@last_nid = nid,@last_status,0) AS last_status,@last_status := status AS status,@last_nid := nid AS nid 
FROM node_field_revision 
CROSS JOIN (SELECT @last_nid:=-1,@last_status:=0) AS initialize_variables
ORDER BY vid;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...