【问题标题】:MSSQL for ordering by String - a1,a10,a2,a3 etc instead of a1,a2,a3,a10用于按字符串排序的 MSSQL - a1、a10、a2、a3 等而不是 a1、a2、a3、a10
【发布时间】:2023-01-09 21:41:08
【问题描述】:

当我使用 MSSQL 查询对名称进行排序时...
查询:从 dto.test 中选择名称按名称升序排序

我得到 a1,a10,a2,a3 而不是a1,a2,a3,a10

有谁知道需要对特定顺序进行哪些查询更改a1,a2,a3,a10

【问题讨论】:

  • 理想情况下,修复您的设计。如果您希望值按数值排序,请使用数值数据类型将数值部分存储在单独的列中。在字符串'10'小于'2',所以顺序是正确的。
  • @Larnu 有什么方法可以实现字符串数据类型,将此列视为条形码 AAA1、AAA101、AAA2
  • 正如我所说,修复您的设计将是“最佳”解决方案。
  • 否则,您需要在查询中将值拆分为单独的部分(字母和数字部分),然后对其进行排序。我希望您没有像'a10a' 这样的值。
  • 你需要修正你的设计。字符串是字符串,不是数字。 a2 总是在 a10 之前。你问的是非常强烈表明您实际上需要两个单独的列。您可以拆分字符串并将第二部分转换为 int 但这不会使用任何索引并导致非常昂贵的排序

标签: sql-server


【解决方案1】:

您可以尝试以下代码作为 Query Tweak 的一部分。从字符串中拆分数字以获得结果是基本的。

Declare @Sampletable as Table (Col1 varchar(5))

insert into @Sampletable
(Col1)
values ('a1'),('a10'),('a2'),('a3')


;With Cte
as
(
select Col1,Cast( SUBSTRING(Col1, 2, len(Col1)) as int) as Rnk
from @Sampletable
)
Select Col1 from Cte
order by Rnk asc

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多