SQL:如果where子句中的条件

时间:2014-07-07 06:57:39

标签: sql oracle

我想检查表A是否有任何条目只检查表表B中存在一个列值。如果TableA中没有数据,那么只需从TableB获取数据。

我希望TableB选择查询的Exists子句当且仅当TablaA中有数据时,它才会是TableB的纯选择查询

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

如何在单个查询中执行此操作?

类似的东西:

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

3 个答案:

答案 0 :(得分:0)

select b.id
from table_a a
,    table_b b
where a.col = b.id
and a.col_val = 'XXX';

答案 1 :(得分:0)

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设置操作,才能完成。

如果有的话,你想要基于条件的结果,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 :(得分:0)

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

关于此查询Table A中的所有数据都将显示,无论TableB中是否存在关系,或者如果TableATableA有关系,则会显示所有数据关系的值,但如果TableB中的记录在TableB中没有关系,则会返回TableA值,在这种情况下,您可以使用null来过滤你想要什么

WHERE

如果您只想显示SELECT * FROM TableB B LEFT JOIN Table A ON A.id = B.id 中所有TableB关系的记录,请添加此

TableA