可选的IN条款

时间:2015-06-05 17:02:16

标签: sql tsql

如果您有类似下面的内容

SELECT column1
FROM table1
WHERE id IN (SELECT column2 FROM table2 WHERE id2 = 'x')

我有一个场景,其中in子句可能不会返回任何数据,这意味着我应该获取所有数据而不是0行,就好像从未创建了in子句一样。我也不能加入。

4 个答案:

答案 0 :(得分:2)

你试过了吗?

select column1 from table1 
where    id in (select column2 from table2 where id2 = 'x') 
      OR IF NOT EXISTS (select column2 from table2 where id2 = 'x')

如果返回行,这将使用ID in子句,但如果为0行则忽略它。

警告:我不知道较大数据集的性能影响以及查询优化器如何执行此操作。

答案 1 :(得分:1)

使用CTE(公用表表达式)

尝试这样的事情
with filter  as
(
  select distinct
         t2.column2 as id
  from table2 t2
  join table1 t1 on t1.id = t2.column2
                and t2.id2 = 'x'
)
select t1.*
from      table1 t1
left join filter f  on f.id = t1.id
where f.id is not null                    -- matched the filter
   OR 0 = ( select count(*) from filter ) -- filter is empty

答案 2 :(得分:0)

你在做什么数据库?

您可以在SQL Server中执行此操作(但是,您可以在SQL Server中执行此操作):

IF EXISTS (select column2 from table2 where id2 = 'x')
BEGIN
    select column1 from table1 where id in (select column2 from table2 where id2 = 'x')
END
ELSE
BEGIN
    select column1 from table1
END

答案 3 :(得分:0)

我认为这样可以解决问题 如果我明白你在找什么

select column1 
  from table1 
  left join table2 
    on table1.id = table2.colum2 
 where table2.colum2 = 'x'
    or table2.colum2 is null 

TLDR为什么不能加入?

不确定它们的语法是否有效但是这样的事情 你为什么不能加入呢? 但采用这种方法,马丁的答案更好

where id in (select column2 from table2 where id2 = 'x') 
   or (select count(*) from table2 where id2 = 'x') = 0