【发布时间】:2021-11-01 20:45:13
【问题描述】:
我必须对格式不同的字符串进行排序,但我很难找到解决方案。为此在 stackoverflow 上尝试了几个选项,但它对我不起作用,因为它们适用于特定格式的数据。
这是我必须排序的数据示例。
12-ABC
1-ABC
ABC-10
ABC-11
ABC-100
2-ABCD
ABC-100A
我通过 ORDER BY 得到了这样的结果
1-ABC
12-ABC
2-ABCD
ABC-10
ABC-100
ABC-100A
ABC-11
但我想要这个
1-ABC
2-ABCD
12-ABC
ABC-10
ABC-11
ABC-100
ABC-100A
你会怎么做?
【问题讨论】:
-
您想要的不是字母数字排序。排序对格式一无所知。无论如何,这背后的逻辑是什么?甚至不能说您是根据一个或另一个“字段”进行排序的。无论逻辑是什么,我怀疑如果您将这个多值字段拆分为具有正确类型的单独字段并编写一个简单的
ORDER BY,这会更容易很多。即使100A看起来也想成为两个不同的领域。您可能需要 2 个文本字段(描述、标志)和 1 个数字(ID)。ORDER BY ID, Description, Flag会工作 -
我会先写下确切的排序规则,例如:1)数字在字母之前 2)如果值以数字开头,则首先按其数值排序 - 等等。这样你会发现,如何分析列值,如何将其拆分为可排序的部分,以什么顺序以及如何对部分进行排序等等。之后只需要编写代码,不需要反复试验:)
-
如果你也有
3A-ABC和ABC-11A怎么办?另外,如果一个值没有破折号(如30A或ACB),是一个空字符串,还是NULL?您能否在示例数据和所需结果中包含您希望如何处理所有这些其他边缘情况(或声明哪些是不可能的,例如 NOT NULL 约束,或检查长度约束或值是否包含破折号)? -
只是把一个巨大的扳手扔进去,像'
17A12-AB1N9'这样的值呢? -
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: sql sql-server string columnsorting