我收到了一个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
答案 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)
类似的解决方案也可以应用于其他数据库。