2014-01-17 88 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 
相关问题