在MS SQL Server中排序属性 - 包括平面

时间:2016-07-25 16:14:32

标签: sql sql-server

我收到了一个CAG,我试图通过Postcode和Building Number对地址进行排序。我面临的问题是建筑物数量实际上不是整数,它是一个nvarchar-因为平面属性。

你可以看到79B出现在79:

之后
131
133A
133B
135
137
139
141
143
79B <--
87 
89 
91 

我发现了类似的问题: sql-for-ordering-by-number-1-2-3-4-etc-instead-of-1-10-11-12

并尝试了这个

SQL += "ORDER BY BUILDNO * 1 ASC ";

但可以预见我会收到转换错误

Conversion failed when converting the nvarchar value '133A' to data type int.

是否可以在SQL中订购此类型的nvarchar?

感谢

更新

我知道有这个工作,谢谢@paYa

SELECT * FROM [" + tblname + "] 
WHERE POSTCODE LIKE + @postcode + '%' 
ORDER BY CAST(LEFT([BUILDNO], CASE WHEN PATINDEX(N'%[^0-9]%', [BUILDNO]) < 1 THEN LEN([BUILDNO]) ELSE PATINDEX(N'%[^0-9]%', [BUILDNO]) - 1 END) AS INT), 
RIGHT([BUILDNO], LEN([BUILDNO]) - PATINDEX(N'%[^0-9]%', [BUILDNO]) + 1)

返回正确的顺序:

79B
87 
89 
91 
133B
135
137
139
141
143

4 个答案:

答案 0 :(得分:3)

在mssql server

order by cast(left([ColName], case when patindex(N'%[^0-9]%', [ColName]) < 1 then len([ColName]) else patindex(N'%[^0-9]%', [ColName]) - 1 end) as int),
right([ColName], len([ColName]) - patindex(N'%[^0-9]%', [ColName]) + 1);

答案 1 :(得分:0)

您可以将lpad与空白

一起使用

在mysql中

 ORDER BY lpad(your_column,  16 - length(your_column ), ' ')

在sqlserver中

  ORDER BY right(replicate(' ',16 - length(your_column )) + YourFieldValue)

答案 2 :(得分:0)

解析建筑物编号,提取前导整数以及所有其余的整数。 MS SQL:

select nbr
from ( values('79'),('100'),('79B') ) t(nbr)
cross apply (select pos = patindex('%[^0-9]%',nbr+'X')-1 ) x
order by cast(left(nbr, pos) as int)
    , substring (nbr, pos+1, 8000)

答案 3 :(得分:0)

这是一个patindex的解决方案,它基本上剥离了varchar的起始数字。

select *
from yourtable 
order by left(id, patindex('%[a-z]%', id + 'A') - 1)

类似的解决方案也可以应用于其他数据库。