如何实现从users表列用户并关联general表判断motivation是否含NULL?
实现用户关联NULL值判断的SQL查询
要搞定这个需求,核心是得保住所有用户(哪怕他们在general表里没一条记录),同时判断该用户的所有motivation里有没有NULL值。这里给你几种清晰易懂的实现方式:
方法一:用EXISTS子查询(逻辑最直观)
这种写法思路最直接:对每个用户,检查general表里有没有任意一条他们的记录是motivation为NULL的。要是有就返回FALSE,没有就返回TRUE(包括用户在general里完全没记录的情况)。
SELECT u.name, CASE WHEN EXISTS ( SELECT 1 FROM general g WHERE g.iduser = u.id AND g.motivation IS NULL ) THEN 'FALSE' ELSE 'TRUE' END AS motivation FROM users u;
方法二:用聚合函数对比计数
通过对比「非NULL的motivation行数」和「总关联行数」来判断:如果两者相等,说明该用户的所有motivation都不为NULL;反之就存在NULL值。
SELECT u.name, CASE WHEN COUNT(g.motivation) = COUNT(g.iduser) THEN 'TRUE' ELSE 'FALSE' END AS motivation FROM users u LEFT JOIN general g ON u.id = g.iduser GROUP BY u.id, u.name ORDER BY u.id;
逻辑拆解:
LEFT JOIN确保users表的所有用户都被保留,不会被过滤掉。COUNT(g.motivation):只统计motivation不为NULL的行数(COUNT函数会自动忽略NULL值)。COUNT(g.iduser):统计该用户在general表里的总关联行数(只要有记录就计数,不管motivation是不是NULL)。- 像Jane这种在
general里没记录的用户,两个COUNT结果都是0,自然相等,返回TRUE,完全符合需求。
方法三:用MAX+CASE标记判断NULL
先把每条记录的motivation是否为NULL做标记,再取最大值来判断有没有至少一个NULL:
SELECT u.name, CASE WHEN COALESCE(MAX(CASE WHEN g.motivation IS NULL THEN 1 ELSE 0 END), 0) = 0 THEN 'TRUE' ELSE 'FALSE' END AS motivation FROM users u LEFT JOIN general g ON u.id = g.iduser GROUP BY u.id, u.name ORDER BY u.id;
逻辑拆解:
CASE WHEN g.motivation IS NULL THEN 1 ELSE 0 END:把NULL值标记为1,非NULL标记为0。MAX(...):只要存在任何一个NULL,最大值就是1;否则是0。COALESCE(..., 0):处理用户在general里没记录的情况(此时MAX结果为NULL,转成0后最终返回TRUE)。
这几种方法都能满足你的需求,你可以根据自己的使用习惯和数据库性能特点选最合适的写法~
内容的提问来源于stack exchange,提问作者WFender
相关产品推荐
相关产品推荐

