【问题标题】:SQL IN Clause - Possibility of Empty SetSQL IN 子句 - 空集的可能性
【发布时间】:2016-10-09 17:03:33
【问题描述】:

我正在尝试类似以下的方法

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

【问题讨论】:

  • 您在寻找 SQL 解决方案还是 PL/SQL 解决方案?您的问题文本听起来像是您正在寻找 SQL 解决方案,但标签包括 PL/SQL。

标签: oracle plsql in-clause empty-list


【解决方案1】:

您可以添加NOT EXISTS() 声明。虽然这个解决方案在大数据集上效率不高,所以为了更有效的方法,你可以使用PL/SQL

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

【讨论】:

  • 这似乎是简单的解决方案。然而我不明白“这个解决方案对大量数据集没有效率”?还有其他方法可以提高效率吗?
  • 是的,PL/SQL 正在做与您要求的类似的事情,但这是另一回事。只要你被正确索引,这应该没问题。
【解决方案2】:

另一种更有效的解决方案可能是:

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

【讨论】:

  • 这是一个有效的 SQL!它的工作原理我已经在 SQLServer 上测试过了。
  • 他使用的是 Oracle,而不是 SQL-Server
  • 我知道。点是它的有效 SQL。
  • 不,这是 Transact-SQL(微软的方言),因此不是问题的相关答案。 ANSI SQL(或 Oracle SQL)没有IF...ELSE 构造。但是,有一个 CASE...WHEN 构造,您可以使用它做类似的事情。
【解决方案3】:

我在 JAVA 中创建 SQL 时遇到了类似的问题。以下解决了我的问题。

query ="SELECT * FROM tbl " 
+ "WHERE (col IN (:PARAMLIST) "
+ "OR (:PARAMLIST) IS NULL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2013-02-26
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多