2014-01-17 86 views
0

我有一個包含字母數字值的列,名稱爲TableName只要它是字母數字,它幾乎可以是任何短語。如何正確地對SQL Server中的字母數字值進行排序

的樣本數據可能是(不一定是3字母后面的數字)

AAA 1 
AAB 2 
AAC 3 
AAB 10 
AAC 12 
AAB 12 

如果我使用的是正常的有點像ORDER BY表名

這將成爲

AAA 1 
AAB 10 
AAB 12 
AAB 2 
AAC 12 
AAC 3 

我想要完成的是

AAA 1 
AAB 2 
AAB 10 
AAB 12 
AAC 3 
AAC 12 

我想讓你知道,這個領域可能是任何東西 即

ABC123MAS3482 
KASJ19LKA 
213LKS23 

只是爲了讓你知道,有在外地沒有格式。 唯一的規則是它是字母數字。

我希望你們可以幫助我提高你在SQL方面的知識。

我使用SQL Server 2008 R2的

回答

1

我敢肯定這不能太容易。

你的陳述I'd like you to know that this field COULD be ANYTHING i.e.幾乎殺死它,否則可以在兩列中分割字母和數字值或讓它們被一些字符串函數分割。

但是這樣一來,唯一的出路,我可以看到的是:

自己寫的函數返回一個數值,通過它可以進行排序。 然後你可以使用它像這樣:

SELECT AlphaNumericValue FROM ValuesTable ORDER BY dbo.GETSORTVALUE(AlphaNumericValue)

這可能是這樣的功能的虛擬體:

CREATE FUNCTION dbo.GETSORTVALUE(@value NVARCHAR) 
RETURNS INT 
BEGIN 
    DECLARE @dummyValue INT = LEN(@value) 
    -- do something with your string here to get a sorting number 
    RETURN @dummyValue 
END 

由於值內的列可能是anything你需要首先提出一個好的排序,然後應該包含在那個函數中。 例如,你還不確定如何在這種情況下進行排序:

你說AAB 2AAB 10之前要來,但怎麼樣AA2BAA10B

一旦你定義了這個,你的自定義邏輯應該進入該函數。

0

編寫一個函數,在數字的每個子串前面插入前導零並按此排序。您可能希望將其存儲在列中並在數據更改時進行更新。

1

以不同的方式排序字母數字柱:

CREATE TABLE dbo.AlphnumericTable (AlphnumericColumn varchar(50) NULL) 

INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('3') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('AB1') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('A1') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('B2') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('A11') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('B20') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('B21') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('AB10') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('B3') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('AB100') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('2') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('1') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('B32') 
INSERT INTO dbo.AlphnumericTable (AlphnumericColumn) VALUES ('11') 
SELECT AlphnumericColumn FROM dbo.AlphnumericTable 
--Show normal Sort 
SELECT AlphnumericColumn FROM dbo.AlphnumericTable ORDER BY AlphnumericColumn 
--Show AlphaNumberic Sort 
SELECT AlphnumericColumn FROM dbo.AlphnumericTable ORDER BY LEFT(AlphnumericColumn,PATINDEX('%[0-9]%',AlphnumericColumn)-1), -- alphabetical sort 
CONVERT(INT,SUBSTRING(AlphnumericColumn,PATINDEX('%[0-9]%',AlphnumericColumn),LEN(AlphnumericColumn))) -- numerical sort 
--cleanup our work 
DROP Table dbo.AlphnumericTable 
相關問題