【问题标题】:SQL : If condition in where clauseSQL:如果条件在where子句中
【发布时间】:2014-07-07 06:57:39
【问题描述】:

我想检查表 A 是否有任何条目,然后只检查表 B 中是否存在表 A 列值。如果表 A 中没有数据,则从表 B 中获取数据。

当且仅当 TablaA 中有数据时,我希望 TableB 选择查询的 Exists 子句,否则它将只是 TableB 的普通选择查询

内连接不起作用,因为 TableA 可能没有任何数据,甚至没有左连接。

如何在单个查询中做到这一点?

类似这样的:

select Id from TableB where 
if( select count(*) from TableA ) > 0 then Id in (select col from TableA)

【问题讨论】:

  • 什么?我无法理解。它太模糊了。
  • A表不为空怎么办?
  • 如果我的理解有误,请纠正我,您想检查表 A 是否有记录,如果是,您将显示记录在表 A 和表 B 中有关系?如果没有记录?会发生什么?它只会显示表 B 的所有记录还是什么也不显示?因为如果您只想查找表 A 中是否有与表 B 相关的记录,只需使用 Join 它将为您获取记录..
  • @wrecklez:你的理解是对的。检查表A是否有记录,如果有则显示记录在表A和表B中有关系。如果没有记录,则只显示所有记录表 B.
  • @user1049021 你能看到,如果我更新的答案对你有帮助吗?

标签: sql oracle


【解决方案1】:
select b.* from tableB b, tableA A
Where b.id = a.id

一个简单的连接就足够了。

其他方式是使用EXISTS。并将您的条件放入其中。

select * from tableB b
Where exists
(Select 'x' from tableA a 
 Where a.id=b.id)

编辑:

希望你需要这个。

/* first part returns result only when tableA has data */
select b.* from tableB b, tableA A
Where b.id = a.id
Union
/* Now we explicitly check for presence of data in tableA,only 
    If not we query tableB */
Select * from tableB 
Where not exists (select 'x' from tableA)

所以,只有一部分查询会返回结果,作为相同的结果集,UNION set 操作可以做到这一点。

如果您想要基于条件的结果,PL /SQL 可能是一个不错的选择!

VARIABLE MYCUR REFCURSOR;
/* defines a ref cursor in SQL*Plus */

DECLARE
  V_CHECK NUMBER;
BEGIN
   SELECT COUNT(*) INTO V_CHECK
   FROM TABLEA;

   IF(v_CHECK > 0) THEN
     OPEN :MYCUR FOR
        select b.* from tableB b, tableA A
        Where b.id = a.id;
   ELSIF
     OPEN :MYCUR FOR
       select * from tableB;
   END IF;
END;
/
/* prints the cursor result in SQL*Plus*/
print :MYCUR

【讨论】:

    【解决方案2】:
    select b.id
    from table_a a
    ,    table_b b
    where a.col = b.id
    and a.col_val = 'XXX';
    

    【讨论】:

      【解决方案3】:

      我认为这可能会对您有所帮助,但我知道这不是最佳答案, 以我自己的理解,您希望始终显示您的 Table B 的记录并检查 TableA 是否有记录找到他们的关系,但我认为如果您在 Table A 中有记录,则不需要计算,如果你使用 LEFT JOIN 并设置一些条件来过滤这里是我的例子......

      在此查询中,无论TableA 中是否有关系,都将显示来自TableB 的所有数据,或者如果有TableATableB 有关系,它将根据关系返回值,但是如果TableB 中的记录在TableA 中没有关系,它将返回null 值,在这种情况下您可以使用WHERE 过滤您想要的内容

      SELECT * FROM TableB B
      LEFT JOIN Table A ON A.id = B.id
      

      如果您只想显示 TableB 的所有记录,并在 TableA 中添加此关系

      WHERE NVL(A.id,0) > 0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多