SQL:where子句中的If条件

SQL:where子句中的If条件,sql,oracle,Sql,Oracle,我想检查表A是否有任何条目,然后只检查表B中是否存在表A列值。如果表A中没有数据,则只从表B中获取数据 我想让Exists子句用于TableB选择查询当且仅当TableA中有数据时,否则它将只是TableB的普通选择查询 内部连接不起作用,因为TableA可能没有任何数据,甚至没有左连接 如何在单个查询中实现这一点 大概是这样的: select Id from TableB where if( select count(*) from TableA ) > 0 then Id in (s

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

我想让Exists子句用于TableB选择查询当且仅当TableA中有数据时,否则它将只是TableB的普通选择查询

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

如何在单个查询中实现这一点

大概是这样的:

select Id from TableB where 
if( select count(*) from TableA ) > 0 then Id in (select col from TableA)
一个简单的连接就足够了

另一种方法是使用
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)
因此,只有查询的一部分将返回结果,因为相同的resultset,
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

我想这可能对你有帮助但我知道这不是最好的答案, 根据我自己的理解,您希望始终显示
表B
的记录,并检查
表a
是否有记录,以查找它们之间的关系,但我认为如果您在
表a
中有记录或没有记录,则不需要计算,如果您使用左连接并设置一些条件进行筛选,这里是我的示例

在该查询中,将显示
TableB
中的所有数据,无论
TableA
中是否存在关系,或者如果
TableA
TableB
存在关系,则将返回基于该关系的值,但是如果
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

什么我不明白。太模糊了。如果表A不是空的,你想怎么办?如果我的理解有误,请纠正我,如果有记录,你想检查表A,如果有,你将在表A和表B中显示记录有关系?如果没有记录呢?会发生什么?它将只显示表B的所有记录,还是什么也不显示?因为如果你只是想知道表a中是否有一条记录与表B相关,只需使用Join,它就会为你获取记录。@Cranklez:你的理解是正确的。如果有记录,请检查表a,如果有,则显示表a和表B中有关系的记录。如果没有记录,它将只显示表B的所有记录。@user1049021如果我的更新答案对您有帮助,您能看到吗?
SELECT * FROM TableB B
LEFT JOIN Table A ON A.id = B.id
WHERE NVL(A.id,0) > 0