Sql-Server-2008-R2
對 varchar 類型列進行排序(字母數字值)
在我的表
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
結果: