嵌套CASE..WHEN - SQL

时间:2014-05-20 07:06:34

标签: sql oracle

  1. 如果Tab1.Col1 = Tab2.Col1,则从表2中获取Stats1字段
  2. 如果Tab3.Col3 = Tab2.Col3,则从表3中获取Stats3字段
  3. 如果Tab2.Col2 = substr(Tab3.XYZ,1,2)然后传递Stats1(从上面的步骤1作为Com_Desc),则传递Stats3(从步骤2作为Com_Desc)
  4. 如果从步骤3派生的Com_Desc为NULL或空白,则传递-1
  5. 我想使用case when语句实现上述逻辑。编写了查询但是当stats1和stats3都为NULL时无法填充-1值 以下是我的查询 -

    SELECT 
    (CASE WHEN (Tab2.Col2 = substr(Tab3.XYZ,1,2)
    THEN ((CASE WHEN Tab2.Stats1 is NOT NULL THEN Stats1 
          ELSE (CASE WHEN Tab3.Stats 3 is NOT NULL THEN Stats3
                ELSE -1
                END) 
          END)
     ELSE END)COM_DESC
    FROM Tab1, Tab2, Tab3
    WHERE Tab2.Stats1 IN (SELECT Tab2.Stats1 
                          FROM Tab1, Tab2 WHERE Tab1.Col1 = Tab2.Col1)
    AND Tab3.Stats3 IN (SELECT Tab3.Stats3 
                        FROM Tab2, Tab3 WHERE Tab3.Col3 = Tab2.Col3);
    

2 个答案:

答案 0 :(得分:0)

我会给你一个草图,你的描述中有些东西我不明白。例如,在步骤4中,如果不是-1,则返回什么?

select coalesce(nullif(case when Col2 = substr(XYZ,1,2) 
                            then stats1 
                            else Stats3 
                       end, ''), '-1)
from (
    select Tab2.col2
      , Tab3.XYZ
      , case when Tab1.Col1 = Tab2.Col1
             then Tab2.Stats1
        end as stats1
      , case when Tab3.Col3 = Tab2.Col3 
             then Tab3.Stats3
        end as stats3
    from Tab1, Tab2, Tab3
    where ...
)

答案 1 :(得分:0)

我不知道你如何加入表格,但你的CASE可以使用COALESCE(返回第一个非NULL值,这只是一个更复杂的CASE的快捷方式):

CASE
   WHEN (Tab2.Col2 = substr(Tab3.XYZ,1,2)
   THEN COALESCE(Tab2.Stats1, Tab3.Stats3, -1)
END COM_DESC

也许您还需要添加ELSE -1