2016-06-09 82 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