我的varchar
列包含数字(1-99999)
和字母(AM0001-BF9999).
由于它有字母所以我无法将其转换为int
。
有没有办法可以使用grouping_id
按数字(从小到大)排序此列,然后按字母(按字母顺序)排序?
谢谢..
答案 0 :(得分:1)
您需要知道字段的最大长度。假设有25个字符用于说明目的,这将起作用:
select
v
from (
select
right(space(25) + v,25) as v
from ( values
('1-99999')
,('AM0001-BF9999')
) data(v)
)data
order by v
产量:
v
-------------------------
1-99999
AM0001-BF9999
答案 1 :(得分:1)
您可以尝试使用ISNUMERIC
功能,如下所示:
select * from test_table
order by
case isnumeric(test_column)
when 1 then convert(int,test_column)
else 999999 end, test_column
答案 2 :(得分:0)
这是您在对数据库模式进行非规范化时获得的结果
前缀和号码应分开存放
也就是说,这就是我遇到同样问题时所做的事情:
SELECT * FROM YOUR_TABLE
ORDER BY dbo.GetNumbers(YOUR_FIELD), YOUR_FIELD
Create Function dbo.GetNumbers(@Data VarChar(8000))
Returns int
AS
Begin
Return CAST(Left(
SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000),
PatIndex('%[^0-9.-]%', SubString(@Data, PatIndex('%[0-9.-]%', @Data), 8000) + 'X')-1) AS int)
End
另见本文从字符串中提取数字
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/extracting-numbers-with-sql-server/