0

假设我有一个表,其中包含一个包含数字的列,当我在 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 |
4

6 回答 6

0

确保您使用的是OR运算符而不是AND,因为text不能同时使用NULLand 1234

要测试空字符串,也只需使用空双引号''

select text
from table
where text IS NULL OR num = 1234 OR text = ''

编辑以下用户评论

根据您的评论,我进行了进一步的编辑,可能(或可能不会)回答您的问题。本质上,我相信您要求查询返回空\nulltext和 1234 作为 的num行​​,以及所有没有 1234 作为num.

这应该完成结果,如下所示:

select text
from table
where (text IS NULL AND num = 1234) OR num != 1234

这将返回具有以下任何一项的结果:

  • text设置为NULL和 anum的所有行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

这将基本上排除所有 anum为 1234 而 atext不是的行NULL

于 2013-08-05T19:35:53.653 回答
0

放一个 or 那里

select text
from table
where text IS NULL or num<>1234
于 2013-08-05T19:36:00.453 回答
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)
于 2013-08-05T19:36:13.950 回答
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;
于 2013-08-05T19:42:49.493 回答
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
     )

Sql 小提琴演示

或者这样:

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

Sql 小提琴演示

于 2013-08-05T19:43:56.897 回答
0

尝试这个

select text,num
from table
where isnull(text,0)=0 or num=1234
于 2013-08-05T21:00:26.103 回答