首页 > 解决方案 > 根据第一个字段的值使用不同字段进行 SQL 排序

问题描述

尝试根据第一个字段的值对具有不同字段的数据进行排序。我认为这会起作用,但我找不到错误

Order By 
Case LGP_Colorway_PDC1_int when 10
    then    LGP_Style_Kind_enum,
            LGP_Colorway_PDC2_int,
            LGP_Colorway_PDC3_int,
            LGP_Style_SAPHrchyLvl2_enum,
            LGP_ShapeMaster_ManualCode_string
else        LGP_Colorway_PDC1_int,
            LGP_Colorway_PDC2_int,
            LGP_Colorway_PDC3_int,
            LGP_Style_SAPHrchyLvl2_enum,
            LGP_ShapeMaster_ManualCode_string end 

我的 SQL 在 'order by' 附近显示语法错误

此外,如何降序排序 LGP_Style_Kind_enum ?

标签: sqlsql-serversql-order-by

解决方案


case表达式返回单个值。逗号分隔的列表不是单个值。

case您可以通过将其拆分为多个表达式来解决此问题:

Order By (case when LGP_Colorway_PDC1_int = 10 then LGP_Style_Kind_enum end),
         (case when LGP_Colorway_PDC1_int = 10 then LGP_Colorway_PDC2_int end),
         (case when LGP_Colorway_PDC1_int = 10 then LGP_Colorway_PDC3_int end),
         (case when LGP_Colorway_PDC1_int = 10 then LGP_Style_SAPHrchyLvl2_enum  end),
         (case when LGP_Colorway_PDC1_int = 10 then LGP_ShapeMaster_ManualCode_string end),
         (case when LGP_Colorway_PDC1_int <> 10 then LGP_Colorway_PDC1_int end),
         (case when LGP_Colorway_PDC1_int <> 10 then LGP_Colorway_PDC2_int end),
         (case when LGP_Colorway_PDC1_int <> 10 then LGP_Colorway_PDC3_int end),
         (case when LGP_Colorway_PDC1_int <> 10 then LGP_Style_SAPHrchyLvl2_enum end),
         (case when LGP_Colorway_PDC1_int <> 10 then LGP_ShapeMaster_ManualCode_string end)

请注意,这会将每个列引​​用拆分为自己的case表达式。那是故意的。否则,您必须确保类型兼容——如果不兼容,可能会出错。

此外,这使用<>假设LGP_Colorway_PDC1_int是 never NULL。如果可以NULL,那么逻辑需要考虑到这一点。


推荐阅读