如何在sql中使用字符串和数值对varchar进行排序

如何在sql中使用字符串和数值对varchar进行排序,sql,sql-server,Sql,Sql Server,我在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 SEL

我在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、16C、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
请注意,用户输入的排列和字符不一致

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

感谢您的帮助


谢谢

根据新要求编辑

;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
查找后面第一个非数字字符。

Hi@Mat,谢谢你的回答,我更新了帖子并添加了新值进行排序。@BizApps我已切换此选项,将查找第一个数字(1、10等),然后按它排序。如果没有空格来表示连字符和@符号等,则无关紧要。它只提取第一个数字