在SQL Server 2008中排序nvarchar

时间:2012-05-26 04:52:59

标签: sql sql-server tsql

我在SQL Server中有一个包含此数据的表:

Id
=====
1
12e
5 

我希望像这样订购这些数据:

id
====
1
5
12e 

我的id列的类型为nvarchar(50),我无法将其转换为int

我可以用这种方式对数据进行排序吗?

3 个答案:

答案 0 :(得分:3)

作为一般规则,如果您发现自己正在操纵部分列,那么您几乎肯定会做错了。

如果您的ID由数字和alpha组件组成,并且您需要仅使用数字位,请将其设为两列并为自己保留一些焦虑。在这种情况下,您有一个整数id_numeric和一个varchar id_alpha,您的查询就是:

select   char(id_numeric) | id_alpha as id
from     mytable
order by id_numeric asc

或者,如果您确实必须将其存储为单个列,请创建额外的列以容纳各个部分并使用它们进行排序和选择。但是,为了缓解连续重复数据的问题,请使用触发器来确保数据保持一致:

select   id
from     mytable
order by id_numeric asc

你通常想要在每个选择上进行此分割,因为它永远不会很好地扩展。通过将其作为更新/插入触发器,您只需在需要时进行拆分(即,当数据发生更改时),并且此成本将在所有选择中分摊。这是一个好主意,因为在绝大多数情况下,数据库的读取频率远远高于编写数据库。

出于性能原因,恢复较低级别的规范化是完全正常的做法,提供您理解并减轻后果。

答案 1 :(得分:1)

我实际上使用this function的内容,但要注意它不会超级快。我修改了该函数只返回数字:

CREATE FUNCTION dbo.UDF_ParseNumericChars
(
  @string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
WITH SCHEMABINDING
AS
BEGIN
  DECLARE @IncorrectCharLoc SMALLINT
  SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
  WHILE @IncorrectCharLoc > 0
  BEGIN
    SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
    SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
  END
  SET @string = @string
  RETURN @string
END
GO

创建该功能后,您可以这样排序:

  SELECT YourMixedColumn
    FROM YourTable
ORDER BY CONVERT(INT, dbo.UDF_ParseNumericChars(YourMixedColumn))

答案 2 :(得分:0)

可以使用Len功能进行排序

 create table #temp (id nvarchar(50) null)
 select * from #temp order by LEN(id)