假设我有一个包含其中包含数字的列的表,当我在where语句中匹配该数字时,如果某个其他列为空,我希望该行中某些其他列的值。很容易
我还想列出,但是这个数字很简单并不存在。 IS NULL不起作用,因为它根本不存在
(row) id | num | text
1 1 | 5433 | a
2 1 | 1234 | b
3 3 | 4532 | b
4 3 | 1234 | c
5 4 | 5312 | d
6 4 | 1234 |
7 5 | 4654 | a
...查询
select text
from table
where text IS NULL AND num=1234
会返回第6行,但我希望它也返回id 5,因为它不包含1234值,如此
5 | 1234 |
答案 0 :(得分:0)
请确保您使用的是OR
运算符而不是AND
,因为text
不能同时为NULL
和1234
。
要测试空字符串,只需使用空双引号''
:
select text
from table
where text IS NULL OR num = 1234 OR text = ''
修改以下用户评论
我在您的评论后进行了进一步的编辑,可能(或可能不)回答您的问题。
从本质上讲,我相信您要求查询返回空的\ null text
和1234作为num
的行,以及所有没有1234的行作为num
这应该完成结果,如下:
select text
from table
where (text IS NULL AND num = 1234) OR num != 1234
这将返回具有以下任何内容的结果:
text
设为NULL
且num
为1234
的所有行num
未设置为1234
根据上面的原始行列表,您将通过此查询获得以下结果:
(row) id | num | text
1 1 | 5433 | a
3 3 | 4532 | b
5 4 | 5312 | d
6 4 | 1234 |
7 5 | 4654 | a
这基本上会排除num
为1234且text
不是NULL
的所有行。
答案 1 :(得分:0)
放一个或那里
select text
from table
where text IS NULL or num<>1234
答案 2 :(得分:0)
我认为,为了清楚起见,您最好的选择是将两个单独的查询结合在一起。所以你已经得到了你的一半,只需将它与你想要的那个结合起来:
select text
from table
where text IS NULL AND num=1234
union
select text
from table
where id not in (select id from table where num = 1234)
答案 3 :(得分:0)
您希望文本值为1234的行为NULL,无论该行是否存在。但是,在第二种情况下,您需要“创建”该行。
以下方法将其拆分为union all
。第一部分获取表中存在值的行,但是NULL
。当没有1234
行时,第二个“创建”一行:
select id, 1234, text
from table t
where text is NULL and num = 1234
union all
select id, 1234, NULL as text
from table t
group by id
having sum(case when num = 1234 then 1 else 0 end) = 0;
您可以使用一个表达式执行此操作,但它有点复杂:
select id, 1234 as num, NULL as text
from table t
group by id
having sum(case when num = 1234 then 1 else 0 end) = 0 or
sum(case when num = 1234 and text is null then 1 else 0 end) = 1;
答案 4 :(得分:0)
尝试这种方式:
select *
from tab t
where text is null
or
not exists
(
select 1
from tab t1
where t1.id = t.id
and t1.num =1234
)
或者这样:
select t.ID,1234,null as text
from tab t
left join tab t1 on t1.id = t.id
and t1.num =1234
where t1.id is null
union all
select t.ID,t.num,t.Text
from tab t
where text is null
答案 5 :(得分:0)
试试这个
select text,num
from table
where isnull(text,0)=0 or num=1234