有一个表T0看起来像这样,并使用MySQL 5.7。正在将ID存储在id
中,将文本存储在C1中,并将NULL存储在C2中,将整数存储在C2中-NULL是默认值。 C1中的一个条目在C2中可以有多个值。如果您了解Closure表,您会注意到该表略有不同,因为C1条目与id条目不对应。
id | C1 | C2
---+----+-----
1 | a | NULL
2 | b | NULL
3 | c | NULL
4 | c | 3
5 | c | 5
6 | d | NULL
C1的值存储在C2中。设置该表以使C1在C2中不能有重复的值。因此,例如c不能有两个3。因此,该表是唯一的。
希望查询返回字段C1值为3的所有行,如果C1值不为3,则返回C1值为NULL的行。
尝试了以下代码,但无济于事。
SELECT *
FROM T0
WHERE C2 = 3 OR C2 IS NULL
因此查询应该能够返回1、2、4和6。所需的结果是:
id | C1 | C2
---+----+-----
1 | a | NULL
2 | b | NULL
4 | c | 3
6 | d | NULL
答案 0 :(得分:2)
您可以使用NOT EXISTS
检查该情况:
SELECT *
FROM t
WHERE (
C2 = 3
) OR (
C2 IS NULL AND NOT EXISTS (
SELECT 1
FROM t AS x
WHERE x.C1 = t.C1 AND x.C2 = 3
)
)
答案 1 :(得分:0)
如何使用UNION
?
SELECT * FROM t0 where C2=3
UNION
SELECT * FROM t0 where C2 IS NULL AND C1 NOT IN (SELECT C1 FROM t0 WHERE C2<>3) ORDER BY id;
答案 2 :(得分:0)
这是一种更简单的方法,并且当表中有很多行时,它比进行联接要快。
SELECT *
FROM T0
WHERE (C2 = 3)
OR (C2 IS NULL AND
C1 NOT IN (SELECT C1 FROM T0 WHERE C2 = 3))
答案 3 :(得分:0)
您是否必须显示ID?如果没有,那么这变得容易:
select c1, max(c2)
from t0
where c2 = 3 or c2 is null
group by c1
order by c1;