【问题标题】:Simplify nested case when statement简化嵌套 case when 语句
【发布时间】:2014-07-12 10:57:01
【问题描述】:

下面是我当前的 SELECT CASE 语句:

SELECT CASE 
WHEN edition = 'STAN' AND has9 = 1 THEN '9'
WHEN edition = 'STAN' AND has8 = 1 THEN '8'
WHEN edition = 'STAN' AND has7 = 1 THEN '7' 
WHEN edition = 'STAN' AND hasOLD = 1 THEN 'OLD'
WHEN edition = 'SUI'  AND has_s9 = 1 THEN 'S9' 
WHEN edition = 'SUI'  AND has_s8 = 1 THEN 'S8' ELSE 'S7' END AS version

我并不总是想重复 edition = 'xxx' 的条件,比如

CASE WHEN edition = 'STAN' AND has9 = 1 THEN '9' ELSE WHEN has8 = 1 THEN '8' ELSE WHEN has7 = '7' ELSE WHEN edition 'SUI' AND has_s9 = 1 THEN 'S9' ELSE ...

在 Excel 中这相当容易,但如何在 PostgreSQL 中编译它?

【问题讨论】:

  • 从您当前的 SELECT CASE 语句来看,您需要检查您的数据模型。 has9、has8、has7 和 hasOld 是互斥的,或者它们之间存在某种层次结构。在这两种情况下,您最好重构您的数据模型。
  • 我同意,这只是一个缩短的版本,因为我的优先级是嵌套 case when 语句。你是对的,有一些层次结构,完整的读起来像 SELECT CASE WHEN edition = 'STAN' AND has9 = 1 THEN '9' WHEN edition = 'STAN' AND has9 = 0 AND has8 = 1 Then '8' etc. 你指的是帕特里克吗?

标签: sql postgresql case-when nested-queries multiple-conditions


【解决方案1】:

试试这个

SELECT CASE 
WHEN edition = 'STAN' THEN 
     CASE 
          WHEN has9 = 1 THEN '9'
          WHEN has8 = 1 THEN '8'
          WHEN has7 = 1 THEN '7'
          WHEN hasOLD = 1 THEN 'OLD'
     END
WHEN edition = 'SUI' THEN
     CASE 
          WHEN has9 = 1 THEN 'S9'
          WHEN has8 = 1 THEN 'S8'
     END
ELSE 'S7' END AS version

【讨论】:

    【解决方案2】:

    您可以在何时嵌套您的案例。

    顺便说一句,当你在单个字段上做一个案例时,你可以这样做

    case <field> when <value>
                 when <otherValue>
    

    然后

     case when <field> = <value>
          when <field> = <otherValue>
    

    所以

    case edition
          when 'STAN'
             case when has9 = 1 then '9'
                  when has8 = 1 then '8'
                  when has7 = 1 then '7'
                  when hasOLD = 1 then 'OLD'
             end
         when 'SUI'
             case when has_s9 = 1 then 'S9'
                  when has_s8 = 1 then 'S8'
             end
         else 'S7'
    end as version
    

    【讨论】:

      【解决方案3】:

      Postgres 支持both syntax variants for CASE:“simple CASE”和“searched CASE”。使用“简单案例”。您还可以嵌套混合两种变体:

      SELECT CASE edition 
             WHEN 'STAN' THEN 
                CASE WHEN has9 = 1 THEN '9'
                     WHEN has8 = 1 THEN '8'
                     WHEN has7 = 1 THEN '7' 
                     WHEN hasOLD = 1 THEN 'OLD'
                     -- no ELSE means ELSE NULL
                END
             WHEN 'SUI' THEN
                CASE WHEN has_s9 = 1 THEN 'S9' 
                     WHEN has_s8 = 1 THEN 'S8'
                END  -- no ELSE means ELSE NULL
             ELSE 'S7'
             END AS version;
      

      要实现这一点更进一步,您可以切换常量变量。两者都只是表达式,可以在 Postgres 中交换位置。也许不那么容易阅读和理解,但如果你想要最短的代码......

      SELECT CASE edition 
             WHEN 'STAN' THEN 
                CASE 1
                WHEN has9   THEN '9'
                WHEN has8   THEN '8'
                WHEN has7   THEN '7' 
                WHEN hasOLD THEN 'OLD'
                END
             WHEN 'SUI' THEN
                CASE 1
                WHEN has_s9 THEN 'S9' 
                WHEN has_s8 THEN 'S8'
                END
             ELSE 'S7'
             END AS version;
      

      另外:CASE statements in plpgsql (the procedural language) 的语法略有不同。 (不同的东西,真的!)

      【讨论】:

        猜你喜欢
        • 2016-12-10
        • 2018-03-20
        • 2019-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多