2016-06-09 148 views
1

我试图像下面SQL IN子句 - 空集

SELECT * FROM tbl WHERE col IN (SELECT col1 FROM tbl1) 

然而,当SELECT col1 FROM tbl1返回任何结果,我想显示从TBL的所有结果

像这样的事情

的可能性
IF(SELECT col1 FROM tbl1) 
SELECT * FROM tbl WHERE col IN (SELECT col1 FROM tbl1) 
ELSE 
SELECT * FROM tbl 
+0

你寻找SQL解决方案还是PL/SQL解决方案?你的问题的文字听起来像你正在寻找一个SQL解决方案,但标签包含PL/SQL。 –

回答

3

您可以添加NOT EXISTS()声明。虽然这种解决方案不会对大型数据集的高效,所以更有效的方法,你可以使用PL/SQL

SELECT * FROM tbl 
WHERE col IN(SELECT col1 FROM tbl1) 
    OR NOT EXISTS(SELECT 1 FROM tbl1) 
+0

它似乎是一个简单的解决方案。但我不明白“这个解决方案对于大量数据不会有效”?还有其他方法可以提高效率吗? –

+1

是的,'PL/SQL'做类似于你要求的东西,但那是另一回事。只要你有适当的索引,这应该是好的。 – sagi

0

的替代和一点点更有效的解决办法是:

Case when (select Count(*) from tbl1)>0 
Then 
SELECT * FROM tbl WHERE col IN (SELECT col1 FROM tbl1) 
ELSE 
SELECT * FROM tbl 
+0

这不是有效的SQL甚至PL/SQL .. –

+0

这是一个有效的SQL!它的工作原理我已经在SQLServer上测试过了。 – Sam

+0

他使用的是Oracle,SQL不 - 服务器 – sagi