【问题标题】:How can this MySQL query return NULL?这个 MySQL 查询如何返回 NULL?
【发布时间】:2021-02-24 11:52:01
【问题描述】:
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;

nidvid 均为正整数,status 为 0 或 1。

我完全不知道last_status 怎么会导致NULL - 但它确实如此。

MySQL 手册说:

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

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

在进一步的迭代中,@last_status 将永远不会再被设为 NULL。

然而,绝大多数行的@last_status 为NULL——如果我给@last_status 一个初始值,那么这不会发生,但又一次,这意味着我的想法和我的查询是虚假的,但为什么/如何?

【问题讨论】:

标签: mysql mysql-variables


【解决方案1】:

您没有初始化 @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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多