Sql-Server-2008-R2

對 varchar 類型列進行排序(字母數字值)

  • December 14, 2021

在我的表VARCHAR數據類型列CartonNo中,它包含數字或帶有字母的數字,這取決於它。我希望它按數字排序,這將是可接受的升序排序。

  • 第 1 期

例如,包含如下數據

1-2
1
3-5
6
1-2A
6-12
7-8
9-12D
9-12
17
9-12B
19
20-30
15-18

現在我想訂購如下數據

1
1-2
1-2A
3-5
6
6-12
7-8
9-12
9-12B
9-12D
15-18
17
19
20-30
  • 第 2 期

波紋管值 如何對字母數字進行排序?

PT15-8-2

PT15-12-10

PT15-12-3

PT15-12-572-575

PT15-12-31

PT11-96

PT11-133-36

PT11-133

PT16-136

PT8-644

PT09-655

PT9-655

PT12-752

PT14-752

PT13-752

PT14-753

PT10-778

PT13-977-978

PT13-979-988

誰能告訴我應該如何編寫查詢?

我假設在-integer總是有價值之前

declare @temp table
(val nvarchar(99))
insert into @temp values ('1-2'  )
insert into @temp values ('3-5'  )
insert into @temp values ('1-2A')
insert into @temp values ('6-12')
insert into @temp values ('6-7')
insert into @temp values ('6-12D')
insert into @temp values ('20-30')
insert into @temp values ('15-18')
--insert into @temp values ('3')
--insert into @temp values ('53')

詢問

select * from @temp
order by CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)

完全訂購

select * from @temp
order by CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)
,CAST(LEFT(RIGHT(val,LEN(val)-CHARINDEX('-',val)), patindex('%[^0-9]%', RIGHT(val,LEN(val)-CHARINDEX('-',val))+'.') - 1)  AS INT),
RIGHT(val,LEN(val)-CHARINDEX('-',val))

執行第二個查詢後,輸出將是

在此處輸入圖像描述

評論後更新有時 varchar val 不會出現 (3-5) 或 (1-12A) 而不是整數 3 或 5…當時上述答案出錯…如何更正排序方式.

-- DECLARE TABLE
DECLARE @temp TABLE
(val nvarchar(99))

--INSERT INTO TABLE
INSERT INTO @temp VALUES 
('1-2'), ('1'), ('3-5'), ('6'), ('1-2A'), ('6-12'), ('7-8'), ('9-12D'), ('9-12'), ('17'), ('9-12B'), ('19'), ('20-30'), ('15-18')

-- QUERY
SELECT * FROM @temp
ORDER BY
CASE 
   WHEN ISNUMERIC(val) = 0 THEN CAST(LEFT(val,CHARINDEX('-',val)-1)  AS INT)
   WHEN ISNUMERIC(val) = 0 THEN CAST(LEFT(RIGHT(val,LEN(val)-CHARINDEX('-',val)), patindex('%[^0-9]%', RIGHT(val,LEN(val)-CHARINDEX('-',val))+'.') - 1)  AS INT)
   ELSE val 
   END ,val

結果:

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/117379