Mysql 选择其中一列的值,但不能同时选择两者

Mysql 选择其中一列的值,但不能同时选择两者,mysql,sql,Mysql,Sql,有一个表T0看起来像这样,使用MySQL 5.7。Am在id中存储id,在C1中存储文本,在C2中存储NULL或整数-默认值为NULL。C1中的条目在C2中可以有多个值。如果您了解闭包表,您会注意到该表略有不同,因为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中。该表设置为

有一个表T0看起来像这样,使用MySQL 5.7。Am在id中存储id,在C1中存储文本,在C2中存储NULL或整数-默认值为NULL。C1中的条目在C2中可以有多个值。如果您了解闭包表,您会注意到该表略有不同,因为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值为空的行

已尝试以下代码,但无效

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

您可以使用“不存在”来检查该条件:

使用工会怎么样


这是一种更简单的方法,并且比在表中有很多行时执行联接要快

SELECT * 
  FROM T0 
 WHERE (C2 = 3) 
    OR (C2 IS NULL AND 
        C1 NOT IN (SELECT C1 FROM T0 WHERE C2 = 3))

您必须显示ID吗?如果没有,那么这很容易实现:

select c1, max(c2)
from t0
where c2 = 3 or c2 is null
group by c1
order by c1;

您在C2中存储的数据类型是什么?您的问题有些混乱。您的意思是要查找存在C2=3的行或存在C2为空的行的C1值吗?要清楚。而且,这种方法似乎与表的使用方式相反。也许你可以解释一下你真正的目标@轻巧的赛车——中国轨道交通公司刚刚擦亮了它。事实上,我不认为它是对立的。NULL是默认值。C1在C2中可以有多个值-更像一对多的关系。没问题!祝你好运。我很想把它改成一个连接,但这里很好:@SalmanA在小提琴里,它工作得很好。我已经检查了代码,它应该可以工作,大多数人不会有任何问题。在我的数据库中,它需要5毫秒的执行和5毫秒的抓取,这很好。但我似乎不明白为什么它在我的数据库中不能像预期的那样工作,而是返回除ID5之外的所有行。你能有一个替代的实现吗?不知道,也许你弄乱了子查询x和t中使用的别名,例如,其中C1=t.C1和t.C2=3是不正确的,它将生成5行而不是4行。我将修改查询,并明确指定别名,因为它们应该是。这听起来不对,@John。索引不影响结果,只影响性能。是的,ID是必需的,因为它们将在另一个表中用作外键。
SELECT * 
  FROM T0 
 WHERE (C2 = 3) 
    OR (C2 IS NULL AND 
        C1 NOT IN (SELECT C1 FROM T0 WHERE C2 = 3))
select c1, max(c2)
from t0
where c2 = 3 or c2 is null
group by c1
order by c1;