自然排序数据混合文本和数字(然后更多文本*有时*)

时间:2011-08-03 15:08:26

标签: mysql sorting sql-order-by natural-sort

我正在为一家经营牲畜拍卖的人工作。他将进入动物作为Lot 1,Lot 2,Lot 3,Lot 3a,Lot 4,... Lot 100,... Lot N.由于这是数字和文本的混合,我首先按长度排序( LotName),LotName。*直到我输入“添加”动物(最后由'a'指定)才有效。

无论如何我可以通过SQL获取数据吗?

*在本网站上找到,谢谢!

1 个答案:

答案 0 :(得分:2)

通过纯SQL?不容易!

我们在我的项目的代码中做了这个,基本上,你应用一个匹配数字或非数字运行的正则表达式(类似([0-9]+)|([^0-9]+)),将一个字符串转换为这样的运行的元组,转换数字运行成整数,然后通过成对比较对元组进行排序。例如:

"Lot 1"   -> ("Lot ", 1)
"Lot 2"   -> ("Lot ", 2)
"Lot 3"   -> ("Lot ", 3)
"Lot 3a"  -> ("Lot ", 3, "a")
"Lot 100" -> ("Lot ", 100)

成对比较然后(a)在字符串前排序整数,(b)按自然顺序排序整数,(c)按自然顺序排序字符串。

如果您能够将正则表达式应用于列进行排序,则可以使用一个将数字“规范化”为固定长度的数字字符串,并用零填充。像这样:

"Lot 1"   -> "Lot 0001"
"Lot 2"   -> "Lot 0002"
"Lot 3"   -> "Lot 0003"
"Lot 3a"  -> "Lot 0003a"
"Lot 100" -> "Lot 0100"

哪个应该正确排序。但是,虽然您可以在Oracle和其他一些数据库中执行此操作,但在MySQL中,您需要使用user-defined function

但是,您可以在数据库外部执行此操作。在批次表中添加一列以存储规范化的批次名称,每当从代码中插入一行时,生成规范化的表单并存储它。然后,您可以使用该列进行排序。