終了数値を数値としてアルファベット順に並べ替える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番目の文字列でソートします。次のようなものです:http://stackoverflow.com/questions/9221851/how-to-remove-any-trailing-numbers-from-a-string 2nd answer。 – xQbert
あなたのアドバイスをありがとう、私はその方向に見ていきます。 –