我被要求按升序排序位置表。表中的数据目前看起来像这样:
然而,当这些数据显示在屏幕上时,我希望它按升序对数字结果进行排序,然后字符串按字母顺序排列。输出应该如下所示:
我尝试使用以下代码
SELECT location FROM freelocations
ORDER BY CAST(SUBSTRING(location, 1, 2) AS INT)
但是,正如预期的那样,这会返回一条错误消息,因为某些位置不是以数字开头的:
将varchar值'GK'转换为数据类型int时转换失败。
非常感谢任何想法或提示
答案 0 :(得分:3)
也许是这样的?
select location
from freelocations
order by
case
when patindex('%[^0-9]%', location) = 1 then 9999999999
else cast(substring(location, 1, patindex('%[^0-9]%', location) - 1) as int)
end,
location
(由于SQL Server缺少正则表达式替换功能,这有点笨拙)
答案 1 :(得分:0)
在投射之前,你应该检查前2个或3个字符是否真的是数字:
SELECT
location
FROM
freelocations
ORDER BY
CASE
WHEN location like '[0-9][0-9][0-9]%' THEN cast(substring(location,1,3) AS INT)
WHEN location like '[0-9][0-9]%' THEN cast(substring(location,1,2) AS INT)
ELSE 9999
END
答案 2 :(得分:0)
按FIELD(字符串+ 0,1),字符串+ 0
排序但请注意'10e20'会被误解!
答案 3 :(得分:0)
尝试这样做以避免施放:
SELECT
x,
RIGHT('000' +LEFT (x,patindex('%[^0-9]%',x)-1),3) sort1,
RIGHT (x,LEN(x)-patindex('%[^0-9]%',x)+1) sort2
FROM
(
SELECT '123asdf' x
UNION
SELECT '12asdf'
UNION
SELECT '13asdf'
UNION
SELECT '12zsdf'
) X
ORDER BY sort1 ,sort2