选择其中一个列值而不是两个列值

时间:2019-04-18 13:10:00

标签: mysql sql

有一个表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

4 个答案:

答案 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;