【问题标题】:How to sort varchar with string and numeric values in sql如何在sql中使用字符串和数值对varchar进行排序
【发布时间】:2017-04-17 13:36:12
【问题描述】:

我在使用 SQL 中的字符串和数值对 varchar 进行排序时遇到问题。

例子:

SELECT Section 
FROM
    (
        SELECT 'SECTION 1--INTRODUCTION' Section UNION ALL
        SELECT 'SECTION 10--ALARMS' Section UNION ALL
        SELECT 'SECTION 11--SYNCHRONIZATION' Section UNION ALL
        SELECT 'SECTION 12--POWER SYSTEMS' Section UNION ALL
        SELECT 'SECTION 13--GROUNDING AND BONDING' Section UNION ALL
        SELECT 'SECTION 2—TELEPHONE EQUIPMENT ORDERS (TEOs)' Section UNION ALL
        SELECT 'SECTION 3--DETAIL ENGINEERING SPECIFICATION REQUIREMENTS' Section UNION ALL
        SELECT 'SECTION 4--CENTRAL OFFICE EQUIPMENT RECORDS' Section UNION ALL
        SELECT 'SECTION 5--EQUIPMENT LAYOUT' Section UNION ALL
        SELECT 'SECTION 6--CARRIER COMMUNICATIONS SPACE EQUIPMENT BUILDING' Section UNION ALL
        SELECT 'SECTION 7--WIRE AND CABLE REQUIREMENTS' Section UNION ALL
        SELECT 'SECTION 8--CABLE RACK, AUXILIARY FRAMING AND LIGHTING SYSTEMS' Section UNION ALL
        SELECT 'SECTION 9 - CROSS CONNECT SYSTEMS' Section UNION ALL
        SELECT '15 MOPS' Section UNION ALL
        SELECT '16 CLECS' Section UNION ALL
        SELECT '2  GENERAL REQUIREMENTS' Section
    ) AS TBL
ORDER BY 
    Section

上面的查询输出 15M,16 C,2G,1,10,11,12,13,2 ...但我需要我的最终输出如下所示

2  GENERAL REQUIREMENTS
15 MOPS
16 CLECS
SECTION 1--INTRODUCTION
SECTION 2—TELEPHONE EQUIPMENT ORDERS (TEOs)
SECTION 3--DETAIL ENGINEERING SPECIFICATION REQUIREMENTS
SECTION 4--CENTRAL OFFICE EQUIPMENT RECORDS
SECTION 5--EQUIPMENT LAYOUT
SECTION 6--CARRIER COMMUNICATIONS SPACE EQUIPMENT BUILDING
SECTION 7--WIRE AND CABLE REQUIREMENTS
SECTION 8--CABLE RACK, AUXILIARY FRAMING AND LIGHTING SYSTEMS
SECTION 9 - CROSS CONNECT SYSTEMS
SECTION 10--ALARMS
SECTION 11--SYNCHRONIZATION
SECTION 12--POWER SYSTEMS
SECTION 13--GROUNDING AND BONDING

请注意,用户放置的排列和字符并不一致。

我已经尝试了这篇文章中的一个答案,但没有任何效果:

SQL Server 2008 - order by strings with number numerically

How do I sort a VARCHAR column in SQL server that contains numbers?

感谢任何帮助。

谢谢!

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    根据新要求进行编辑。

    ;WITH cte AS (
        SELECT 'SECTION 1--INTRODUCTION' Section UNION ALL
        SELECT 'SECTION 10--ALARMS' Section UNION ALL
        SELECT 'SECTION 11--SYNCHRONIZATION' Section UNION ALL
        SELECT 'SECTION 12--POWER SYSTEMS' Section UNION ALL
        SELECT 'SECTION 13--GROUNDING AND BONDING' Section UNION ALL
        SELECT 'SECTION 2—TELEPHONE EQUIPMENT ORDERS (TEOs)' Section UNION ALL
        SELECT 'SECTION 3--DETAIL ENGINEERING SPECIFICATION REQUIREMENTS' Section UNION ALL
        SELECT 'SECTION 4--CENTRAL OFFICE EQUIPMENT RECORDS' Section UNION ALL
        SELECT 'SECTION 5--EQUIPMENT LAYOUT' Section UNION ALL
        SELECT 'SECTION 6--CARRIER COMMUNICATIONS SPACE EQUIPMENT BUILDING' Section UNION ALL
        SELECT 'SECTION 7--WIRE AND CABLE REQUIREMENTS' Section UNION ALL
        SELECT 'SECTION 8--CABLE RACK, AUXILIARY FRAMING AND LIGHTING SYSTEMS' Section UNION ALL
        SELECT 'SECTION 9 - CROSS CONNECT SYSTEMS' Section UNION ALL
        SELECT '15 MOPS' Section UNION ALL
        SELECT '16 CLECS' Section UNION ALL
        SELECT '2  GENERAL REQUIREMENTS' Section
    )
    
    SELECT *
    FROM
        cte
    ORDER BY
        CAST (
           LEFT(
              RIGHT(SECTION,LEN(Section) - PATINDEX('%[0-9]%',Section) + 1)
                 ,PATINDEX('%[^0-9]%'
                 ,RIGHT(SECTION,LEN(Section) - PATINDEX('%[0-9]%',Section) + 1) ) - 1
              )
        AS INT)
    

    这个想法使用PATINDEX 找到第一次出现的数字切分字符串,然后再次使用PATINDEX 找到第一次出现的非数字字符。

    【讨论】:

    • 嗨@Mat,谢谢你的回答,我更新了我的帖子并添加了新的值来排序。
    • @BizApps 我已切换这将查找第一个数字(1,10 等),然后按它排序。如果没有空格哪个连字符和@符号等都没有关系,它只会提取第一个数字
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    相关资源
    最近更新 更多