如何正确排序SQL Server中的字母数字值

时间:2014-01-17 09:59:10

标签: sql-server-2008

我的列中包含一个名为 TableName 的字母数字值,只要它是字母数字,它几乎可以是任何短语。

样本数据可能是(不一定是3个字母后跟一个数字)

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

如果我使用正常排序,例如 ORDER BY TableName

这将成为

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

3 个答案:

答案 0 :(得分: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 2应该在AAB 10之前,但是AA2BAA10B呢?

一旦你定义了这个,你的自定义逻辑应该进入该功能。

答案 1 :(得分: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

答案 2 :(得分:0)

编写一个函数,在数字的每个子字符串前插入一个前导零,并按此排序。您可能希望将其存储在列中,并在数据发生更改时进行更新。