2017-10-20 74 views
0

基于列值,我需要在Oracle sql中执行2个不同的查询。切换oracle语句的case语句以决定执行哪个查询

表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中的具体,得到只有被匹配表A的 Col1中的值和表B

因此,在这种情况下,如果类型是全部,那么结果应该是 R51,R52,R53

如果数据类型为具体,那么结果应该是 R52

任何帮助吗?

+0

听起来像你需要用参数的storeprocedure。 'CASE'评估expresion并生成一个值。不起流量控制的作用。 –

+0

我很困惑。为什么不只是:'SELECT * FROM table_b b内连接table_a a(a.col1 = b.col1 AND b.type ='Specific')或b.type ='All''? –

回答

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' 
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