如果您有类似下面的内容
SELECT column1
FROM table1
WHERE id IN (SELECT column2 FROM table2 WHERE id2 = 'x')
我有一个场景,其中in子句可能不会返回任何数据,这意味着我应该获取所有数据而不是0行,就好像从未创建了in子句一样。我也不能加入。
答案 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