2017-05-16 6 views
1

終了数値を数値としてアルファベット順に並べ替えるT-SQLクエリを作成するにはどうすればよいですか?終了番号以外のアルファベット順の列をソートするT-SQLクエリ

つまり、問題の簡略化のために、文字列の中央にある可能性のある数字を考慮しません。例によって

:ここ

a1XBNR1 
a1XBNR10 <-- this should go after a1BRN2 
a1XBNR2 

ソート正しくないサンプルコード:

-- Alphanumeric sorting with T-SQL 

USE [AdventureWorks2012] 
GO 

CREATE TABLE dbo.TestTable 
(
     id varchar(50) NULL 
) 

DELETE dbo.TestTable 
GO 

INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XANR1') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XANR10') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XANR2') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XANR20') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XANR3') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XB11') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('a1XB2') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('b1XBNR20') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('b1XB30') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('b1XB2') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('AB100') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('1') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('AB1') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('A1') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B2') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('A11') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B20') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B21') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('AB10') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B3') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('AB100') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('2') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B1') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('B32') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('11') 
INSERT INTO dbo.TestTable (TestTable.id) VALUES ('A10') 


-- Attempt 1 - Syntax not supported by T-SQL 
SELECT * 
FROM db.TestTable 
ORDER BY left(id, 1) -- 1st letter as text 
    , substring(fest, '\d+')::int NULLS FIRST -- first number in string as int 
    , id -- whole columns as cheap tiebreaker 

-- Attempt 2 - cannot have digit in the middle of the string 
-- Error: Conversion failed when converting the varchar value '1XBNR1' to data type int. 
SELECT id 
FROM dbo.TestTable 
ORDER BY LEFT(id,PATINDEX('%[0-9]%',id)-1), -- alphabetical sort 
     CONVERT(INT,SUBSTRING(id,PATINDEX('%[0-9]%',id),LEN(id))) -- numerical 
+2

。文字列を逆にすると、2番目のソート列が表示されます。次に、最後の2番目の文字列を2番目の文字列でソートします。次のようなものです:http://stackoverflow.com/questions/9221851/how-to-remove-any-trailing-numbers-from-a-string 2nd answer。 – xQbert

+0

あなたのアドバイスをありがとう、私はその方向に見ていきます。 –

答えて

3

番号の末尾にセットする前に、左部分によってpatindex()reverse()順序を使用して、変換残りのソートのために最後の数値セットを整数に変換します。

select * 
from testtable t 
order by 
    left(id,len(id)-patindex('%[^0-9]%',reverse(id))+1) 
    , convert(int,right(id,patindex('%[^0-9]%',reverse(id)+' ')-1)) 

rextesterデモ:http://rextester.com/XHY76045

リターン:

+----------+ 
| id | 
+----------+ 
| 1  | 
| 11  | 
| 2  | 
| A1  | 
| A10  | 
| A11  | 
| a1XANR1 | 
| a1XANR2 | 
| a1XANR3 | 
| a1XANR10 | 
| a1XANR20 | 
| a1XB2 | 
| a1XB11 | 
| AB1  | 
| AB10  | 
| AB100 | 
| AB100 | 
| B1  | 
| B2  | 
| B3  | 
| B20  | 
| B21  | 
| B32  | 
| b1XB2 | 
| b1XB30 | 
| b1XBNR20 | 
+----------+ 
は...文字列を逆に最初の文字のパットインデックスまでの数字を取得し
+0

それは私が必要としていたものです。本当にありがとう! –

+0

@LessWhiteお手伝いをお待ちしております! – SqlZim

関連する問題