我在SQL Server中有一个包含此数据的表:
Id
=====
1
12e
5
我希望像这样订购这些数据:
id
====
1
5
12e
我的id
列的类型为nvarchar(50)
,我无法将其转换为int
。
我可以用这种方式对数据进行排序吗?
答案 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)