SQL:where子句中的If条件
我想检查表A是否有任何条目,然后只检查表B中是否存在表A列值。如果表A中没有数据,则只从表B中获取数据 我想让Exists子句用于TableB选择查询当且仅当TableA中有数据时,否则它将只是TableB的普通选择查询 内部连接不起作用,因为TableA可能没有任何数据,甚至没有左连接 如何在单个查询中实现这一点 大概是这样的: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
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