【问题标题】:Sort data in varchar alphabet order按 varchar 字母顺序对数据进行排序
【发布时间】:2015-09-01 09:31:39
【问题描述】:

我有以下数据的表格。

 1
 AAAAA01 
 AAAAA01
 AAAAA01
 B21
 AAAAAA1
 B3
 AB100

我想按以下顺序对数据进行排序

 AAAAAA1
 AAAAA01
 AAAAA01
 AAAAA01
 AB100
 B21
 B3
 1

我写了一个语句,但没有给我正确的结果。

    Select
    *
from
    dbo.Section
order by      
    CASE    
      WHEN not Section like '%[^0-9]%' THEN CONVERT(int,Section)
      WHEN  Section like '[0-9]%' THEN CONVERT(int,SUBSTRING(Section,1,PATINDEX('%[A-Z]%',Section)-900000))
    END

为了您的帮助,我提供了表格脚本

  INSERT [dbo].[Section] ([Section]) VALUES (N'1')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAA01')
INSERT [dbo].[Section] ([Section]) VALUES (N'B21')
INSERT [dbo].[Section] ([Section]) VALUES (N'AAAAAA1')
INSERT [dbo].[Section] ([Section]) VALUES (N'B3')
INSERT [dbo].[Section] ([Section]) VALUES (N'AB100')
INSERT [dbo].[Section] ([Section]) VALUES (N'2')
INSERT [dbo].[Section] ([Section]) VALUES (N'B1')
INSERT [dbo].[Section] ([Section]) VALUES (N'B32')
INSERT [dbo].[Section] ([Section]) VALUES (N'11')
INSERT [dbo].[Section] ([Section]) VALUES (N'A10')
INSERT [dbo].[Section] ([Section]) VALUES (N'ABAAAA') 

你能告诉我这如何为我提供正确的答案。

【问题讨论】:

  • 你的表是Section,列也叫Section?
  • @lad2025 表名和列名都是section
  • 你能用文字描述一下想要的排序吗?
  • @jarlh 想要对从 A 开始的内容进行排序并遍历所有 A。然后是 B ...Z
  • @jarlh 在此之后如果任何带有字符的数字 lijke All AAAAA 然后 AAAAAA1 ,然后在结束所有字符开始形式 1 之后的 AAAAA01 所以在我的示例中 1 在最后一个位置

标签: sql sql-server-2008 sql-server-2008-r2


【解决方案1】:

请尝试:

Select    
    *
from
    dbo.Section
order by
    REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE
    (REPLACE ([Section], '0', 'ZZ0'),
    '1', 'ZZ1'),
    '2', 'ZZ2'),
    '3', 'ZZ3'),
    '4', 'ZZ4'),
    '5', 'ZZ5'),
    '6', 'ZZ6'),
    '7', 'ZZ7'),
    '8', 'ZZ8'),
    '9', 'ZZ9'),
    [Section]

Sqlfiddle

新测试数据的选择结果:

请检查您是否正确。

【讨论】:

  • 所有结果都很好,但 B 中的问题在 B1 之后,结果将是 B1-B21-B3-B32 从左到右匹配排序,除了 B...一切都正确。 @Stepan Novikov
  • 谢谢你的回答。如果您喜欢我的问题,请标记我的问题
  • 一个小问题什么是替换(替换(替换意味着在你的查询中)
  • 表示将一个字符串替换为另一个字符串
【解决方案2】:

这是另一种方式。假设您的数字字符串大于 -100000000。

SELECT YourString
FROM YourTable
ORDER BY CASE WHEN YourString LIKE '[0-9]%' THEN 
                        CONVERT(int, YourString) ELSE -100000000  END, YourString

【讨论】:

    【解决方案3】:

    您也可以使用临时表完成您想要完成的任务。但是,对于较大的记录,这可能会增加一些性能开销。所以,我建议你谨慎使用它。

    CREATE table #temp
    (
        Section varchar(20)
    )
    INSERT INTO #temp
       SELECT * FROM dbo.Section WHERE section LIKE '[A-Z]%' order by section ASC
    INSERT INTO #temp
       SELECT * FROM dbo.Section WHERE section LIKE '[0-9]%' order by section ASC
    
    SELECT * FROM #temp
    drop table #temp
    

    【讨论】:

      【解决方案4】:

      这个 SQL 怎么样?我试过你的数据,它返回了正确的顺序

      SELECT section
      FROM section
      ORDER BY LEN(LEFT(Section, PATINDEX('%[0-9]%', Section)-1)) DESC
      

      回复下面@A.Goutam 的评论(对不起,我不知道如何在评论中添加图片)

      我刚刚复制了@A.Goutam给出的数据,直接在我的sql server中试了一下,如下图

      使用新数据的新 SQL 查询

      SELECT section AS section
      FROM section
      ORDER BY LEN(section + '1') DESC
          , LEN(LEFT(section + '1', PATINDEX('%[0-9]%', section + '1')-1)) DESC
          , CONVERT(INT,SUBSTRING(section + '1',PATINDEX('%[0-9]%',section + '1'),LEN(section + '1'))) DESC
      

      结果:

      AAAAAA1
      AAAAA01
      AAAAA01
      AAAAA01
      AAAAA01
      AAAAA01
      ABAAAA
      AB100
      B32
      B21
      A10
      B3
      B1
      11
      2
      1
      

      【讨论】:

      • @Faithir Mohamad Invalid length parameter passed to the LEFT or SUBSTRING function. 抱歉这个错误
      • 它非常适合@A.Goutam 给出的一组值
      • 嗨@A.Goutam,你能把我在编辑后的帖子中的查询截图吗?
      • @FathirMohamad i hv 添加有问题的表格插入脚本,请将其运行到您的表格中
      • @A.Goutam 我添加了新的查询。请检查是否符合您的需求
      【解决方案5】:

      我试图将您的字段分成两部分,alpha 和 num。为了按 Alpha 排序查询,first 和 Num,second。
      但是AAAAA1AAAA01 之后我的逻辑......你有明确的规则来解释为什么你想要AAAA01AAAAA1 之前?

      SELECT SECTION.section,
              CASE
                  WHEN section NOT LIKE '%[^A-Z]'
                  THEN section
                  WHEN section LIKE '[A-Z]%'
                  THEN
                     LEFT (section, PATINDEX ('%[^A-Z]%', section)-1)                  
                  ELSE
                  'ZZZZZZZZZZZZZ'
               END
                  AS Alpha,
                  CASE
                  WHEN ISNUMERIC(section)=1 
                  THEN CAST( section AS int)
                  WHEN SECTION.section LIKE '%[0-9]'
                  THEN
                     CAST( RIGHT (section, PATINDEX ('%[^0-9]%', REVERSE (section))-1 ) AS INT)
                  ELSE
                     0       
               END
                  AS Num
      
          FROM SECTION
      ORDER BY Alpha, Num;
      

      Please see the SQL Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 1970-01-01
        • 2017-05-22
        • 1970-01-01
        相关资源
        最近更新 更多