我有一个在骨头上存储数据的数据库。对于脊椎,我需要按照骨骼的水平对其进行排序。如果您不熟悉,您的脊椎有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
同样,该查询实际上不起作用,但是我认为到此为止您就可以实现我想要的目标。我可以蛮力地为每个级别(而不是每个组)辩护,但这不是编程方式。作为最后的手段,我会这样做。
答案 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