切换oracle sql的case语句来决定执行哪个查询

时间:2017-10-20 15:07:50

标签: sql oracle switch-statement

根据列值,我需要在Oracle sql中执行2个不同的查询。

表A

Col1   Col2
R51    desc_r51
R52    desc_r52
R53    desc_r53

表B

Col1   Type     Username
R51    All      A
R52    Specific B

现在我需要编写一个查询,其中

  • 如果表B中的类型为全部,则从表A中获取 Col1的所有值
  • 如果表B中的Type为Specific,则仅获取匹配的值 表A和表B的Col1

所以在这种情况下,如果Type为All,那么结果应为 R51,R52,R53

如果Type为Specific,则结果应为 R52

任何帮助?

2 个答案:

答案 0 :(得分:0)

试试这个

select A.col1
  from A
 where exists (select 1 from B where type = 'All')
 union 
select  B.col1
  from A, B
 where A.Col1 = B.Col1 and
       B.Type = 'Specific'

答案 1 :(得分:0)

你可以试试这个。

SELECT 'SELECT '
       ||CASE
           WHEN TYPE = 'All' THEN (SELECT Listagg(col1, ',')
                                            within GROUP ( ORDER BY col1 )
                                   FROM   tablea)
           WHEN TYPE = 'Specific'
                AND EXISTS (SELECT 1
                            FROM   tablea a
                            WHERE  a.col1 = b.col1) THEN b.col1
         END
       ||' FROM TABLEA;' as select_statement
FROM   tableb b;  

输出

SELECT_STATEMENT
SELECT R51,R52,R53 FROM TABLEA;
SELECT R52 FROM TABLEA;

http://sqlfiddle.com/#!4/89872/11/0