【问题标题】:Error in order clause of partition by when using multiple case statement使用多 case 语句时分区顺序子句出错
【发布时间】:2020-04-09 10:41:54
【问题描述】:

我想在 partition by 语句中的 order by 子句中使用多个 case 语句。 我有很多专栏,所以我只发布所需的一个。

我的餐桌顾客有:

Select
   name,
   ROW_NUMBER() OVER(PARTITON BY lastname, rollno 
ORDER BY
   CASE
      WHEN
         NVL(gender, address) IS NULL 
      then
         a.effdate desc 
      else
         CASE
            WHEN
               NVL(a.postoffc, a.mon) <= file.effdate 
            then
               file.effdate 
            else
               a.postoffc 
         END
         desc, NVL(l4.covcode, a.pass) 
   end
)
rn 
from
   customers a;

如果,我删除了这些 case 语句,那么我与其他表的连接和查询工作正常。所以,连接语句或任何其他逻辑没有问题。我遇到的问题是当我使用多个 case 语句时。我认为我的语法是错误的。请告诉我如何解决这个错误。我需要这个case语句逻辑作为强制性的。

【问题讨论】:

    标签: sql oracle case oracle12c


    【解决方案1】:

    您需要在声明其他排序标准之前关闭第二个CASE。此外,您在表达式中有一个不需要的DESC,应该将其放在之后

    ORDER BY
        CASE
            WHEN NVL(gender, address) IS NULL THEN a.effdate
            ELSE CASE
                WHEN NVL(a.postoffc, a.mon) <= file.effdate THEN file.effdate 
                ELSE a.postoffc 
            END
        END desc,  --> here
        NVL(l4.covcode, a.pass) 
    

    但总的来说,我认为您不需要嵌套 case 表达式。这应该同样有效,并且更容易理解:

    ORDER BY
        CASE
            WHEN NVL(gender, address) IS NULL THEN a.effdate
            WHEN NVL(a.postoffc, a.mon) <= file.effdate THEN file.effdate 
            ELSE a.postoffc 
        END desc, 
        NVL(l4.covcode, a.pass) 
    

    【讨论】:

    • 这里需要澄清一下条件NVL(gender, address) IS NULL是否被检查为对分区下的每一行有效,或者任何满足此条件的行都会使其有效?
    猜你喜欢
    • 2017-08-15
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多