当过滤器不存在时,SQL返回一行

时间:2013-08-05 19:32:07

标签: sql

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

6 个答案:

答案 0 :(得分:0)

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

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

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设为NULLnum1234的所有行
  • 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
     )

Sql Fiddle Demo

或者这样:

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 Fiddle Demo

答案 5 :(得分:0)

试试这个

select text,num
from table
where isnull(text,0)=0 or num=1234