我有一张桌子:
| ID | ADV_ID | USER_ID |
| 1 | 22 | NULL |
| 2 | 22 | 3 |
| 5 | 44 | NULL |
Run Code Online (Sandbox Code Playgroud)
现在,我想选择行adv_id = 22和哪里user_id = 3.如果该行不存在,我想在哪里获取行adv_id = 22和user_id is null.
我试过这样的方式:
SELECT * FROM `table` WHERE adv_id = 22 AND (user_id = 3 OR user_id is null)
Run Code Online (Sandbox Code Playgroud)
但是这个查询返回两行 - with user_id = NULL和with user_id = 3.我想得到一行 - user_id = 3或者(或者如果不存在的话)user_id = NULL.
我怎么能在一个查询中做到这一点?谢谢.
使用条件聚合:
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT
ADV_ID,
CASE WHEN COUNT(CASE WHEN USER_ID = 3 THEN 1 END) > 0 THEN 3 END USER_ID
FROM yourTable
) t2
ON t1.ADV_ID = t2.ADV_ID AND
((t1.USER_ID IS NULL AND t2.USER_ID IS NULL) OR (t1.USER_ID = t2.USER_ID))
WHERE
t1.ADV_ID = 22;
Run Code Online (Sandbox Code Playgroud)
为了解释,我将子查询别名作为t2聚合ADV_ID,并输出值,3如果该值出现在一个或多个记录中,否则输出NULL.然后,我们将此子查询连接回原始表,条件是两个USER_ID值都是NULL,或者如果不USER_ID匹配,则两个值匹配.
您可以修改演示以查看它为其他输入生成所需的输出.