【问题标题】:ordering strings that ends with numbers correctly正确排序以数字结尾的字符串
【发布时间】:2015-05-23 10:24:39
【问题描述】:

只是好奇,是否有可能实现这种排序:

X5
X30

而不是“开箱即用”的 ORDER BY:

X30
X5

【问题讨论】:

  • 谢谢古法。我也可以像 C# 一样做任何事情(-: 但要寻找 TSQL 解决方案。顺便说一句,为什么 item_5 在你的答案中出现在 file_10 之后?
  • 如果你有像 x[number] 这样的所有值,那么只需再添加一列日期类型(例如 int)并从 x 那里移动数字并按这个新列排序
  • 所以您希望它们按字符串长度(升序)排序?只是猜测,因为您没有提供任何解释,而且您的样本数据集相当小。 order by left( Foo, 1 ), Cast( substring( Foo, 2, 10 ) as Int )?

标签: tsql


【解决方案1】:

假设所有值都包含一个非数字部分,后面可能跟一个数字部分,您可以执行以下操作(使用 AdventureWorks2008R2 示例数据库):

SELECT Name,
    LEFT(Name,LEN(Name)-NULLIF(PATINDEX('%[^0-9]%',REVERSE(Name)),0)+1) AS StringPart,
    CONVERT(FLOAT,RIGHT(Name,NULLIF(PATINDEX('%[^0-9]%',REVERSE(Name)),1))) AS NumericPart
FROM Production.Product
ORDER BY StringPart, NumericPart

如果不满足假设,这将提供“不正确”的结果(例如,如果缺少非数字部分,或者如果在数字部分之后还有另一个字符串部分等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多