簡體   English   中英

使用字母數字和僅字母值的混合對 SQL 中的字母數字列進行排序

[英]Sorting an alphanumeric column in SQL with mix of alphanumeric and alpha-only values

我有一個要求,我必須按字母數字列在 SQL 查詢中應用排序,以便其中的值按如下方式排序:

AD
AH
AK1
B1
B2
B3x
B3y
B11
C1
C6
C12x
UIP

而不是默認方式:

AD
AH
AK1
B1
B11
B2
B3x
B3y
C1
C12x
C6
UIP

我能夠編寫以下 SQL 語句:

SELECT [MyColumn]
FROM [MyTable]
ORDER BY
    LEFT([MyColumn], PATINDEX('%[0-9]%', [MyColumn]) - 1),
    CONVERT(INT, SUBSTRING([MyColumn], PATINDEX('%[0-9]%', [MyColumn]), LEN([MyColumn]) - (PATINDEX('%[0-9]%', REVERSE([MyColumn]))))),
    RIGHT([MyColumn], PATINDEX('%[0-9]%', [MyColumn]) - 1)

我只需要知道如何以有條件的方式實現這一點,這樣就不會為 alpha-only 值觸發它,否則它會出錯,或者是否有辦法讓它與它一起工作?

PS環境是SQL Server 2014。

看起來有點混亂,我同意 Sean Lange 的觀點,即您應該考慮在多個字段中記錄這一點,但是您可以在order by使用case表達式來進行條件排序:

declare @t table(c nvarchar(10));
insert into @t values('AD'),('AH'),('AK1'),('B1'),('B2'),('B3x'),('B3y'),('B11'),('C1'),('C6'),('C12x'),('UIP');

select c
from @t
order by
      case when patindex('%[0-9]%', c) = 0
           then c
           else left(c, patindex('%[0-9]%', c) - 1)
      end
      ,case when patindex('%[0-9]%', c) = 0
           then 0
           else convert(int,substring(c,patindex('%[0-9]%', c),len(c) - (patindex('%[0-9]%', reverse(c)))))
      end
      ,right(c,case when patindex('%[0-9]%', c) = 0
                   then 0
                   else patindex('%[0-9]%', c) - 1
               end
      );

輸出:

+------+
|  c   |
+------+
| AD   |
| AH   |
| AK1  |
| B1   |
| B2   |
| B3x  |
| B3y  |
| B11  |
| C1   |
| C6   |
| C12x |
| UIP  |
+------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM