SQL查询,我可以按大小写顺序排序吗?

时间:2018-07-11 14:44:45

标签: sql postgresql

我有一个在骨头上存储数据的数据库。对于脊椎,我需要按照骨骼的水平对其进行排序。如果您不熟悉,您的脊椎有7个颈椎(您的脖子),12个胸椎(您的肋骨笼)和5个腰椎(下背部),我需要在每个组中对它们进行排序,并按顺序对每个组进行排序然后是颈椎,然后是胸椎,然后是腰椎。

数据库中的椎骨有一列“椎骨水平”,其中颈椎列为C1,C2,C3 ...,胸椎列为T1,T2,T3,而腰椎列为L1,L2,L3 ... I以为你明白了。

我遇到的问题是正常的ASC类型的“ vertebral_level”默认为字母顺序,因此腰椎在颈椎之后而不是在胸椎后被错误地列出,因为L在T之前,更糟的是,因为有12个层次对于T,它们被列为T1,T10,T11,T12,T2,T3 ...

现在,我可以使用以下方法来确定组内的排序顺序:

FROM vertebrae GROUP BY vertebral_level ORDER BY length(vertebral_level), vertebral_level ASC

产生: “ C1”“ C2”“ C3”“ C4”“ C5”“ C6”“ C7”“ L1”“ L2”“ L3”“ L4”“ L5”“ T1”“ T2”“ T3”“ T4”“ T5 “” T6“” T7“” T8“” T9“” T10“” T11“” T12“

几乎在那里,但我需要强制将L级别紧随T级别之后,因此我尝试了此操作:

FROM vertebrae GROUP BY vertebral_level ORDER BY CASE
        WHEN vertebral_level LIKE '%C%' THEN 1 
        WHEN vertebral_level LIKE '%T%' THEN 2
        WHEN vertebral_level LIKE '%L%' THEN 3
        END

然后正确列出组,但未列出级别: “ C2”“ C6”“ C1”“ C3”“ C5”“ C7”“ C4”“ T7”“ T10”“ T8”“ T3”“ T6”“ T9”“ T12”“ T1”“ T2”“ T5 “” T11“” T4“” L4“” L5“” L3“” L2“” L1“

所以我真正想要的是这样的东西,但这实际上不起作用:

FROM vertebrae GROUP BY vertebral_level ORDER BY CASE
        WHEN vertebral_level LIKE '%C%' THEN 1 ORDER BY vertebral_level ASC
        WHEN vertebral_level LIKE '%T%' THEN 2 ORDER BY length(vertebral_level), vertebral_level ASC
        WHEN vertebral_level LIKE '%L%' THEN 3 ORDER BY vertebral_level ASC
        END

同样,该查询实际上不起作用,但是我认为到此为止您就可以实现我想要的目标。我可以蛮力地为每个级别(而不是每个组)辩护,但这不是编程方式。作为最后的手段,我会这样做。

1 个答案:

答案 0 :(得分:3)

我认为这可以满足您的要求

order by (case when vertebral_level like '%C%' then 1
               when vertebral_level like '%T%' then 2
               when vertebral_level like '%L%' then 3
          end),
         length(vertebral_level), vertebral_level

或者,您可以将其缩短为:

order by position(left(vertebral_level, 1) in 'CTL'), 
         length(vertebral_level), vertebral_level

函数position()返回字符串中子字符串的位置。在这种情况下,它将在'CTL'中查找描述椎骨的第一个字符的位置,从而为您提供所需的顺序。

甚至:

order by position(left(vertebral_level, 1) in 'CTL'),
         substr(vertebral_level, 2)::int