Sql Server查询varchar数据像int一样排序

问题描述 投票:0回答:3

我有一张像

这样的桌子
CREATE TABLE table_name
(
P_Id int,
amount varchar(50)
)

数据如

Id amount
----------
1 2340
2 4568
3 10000

现在我想按金额对表进行排序,但一个问题是金额是varchar,所以它像这样对表进行排序

Id amount
----------
3 10000
1 2340
2 4568

但我想要这样的结果

Id amount
----------
3 10000
2 4568
1 2340

我该怎么办?

sql sql-server sql-order-by
3个回答
31
投票

选择时将金额列转换为

ORDER BY
子句中的数字:

SELECT * FROM MyTable
ORDER BY CAST(amount AS Numeric(10,0)) DESC

您可以根据您的要求更改小数点数值以获得更精确的结果:

SELECT * FROM MyTable
ORDER BY CAST(amount AS Numeric(10,2)) DESC
                                   ^

结果:

身份证 金额
3 10000
2 4568
1 2340

参见这个dbfiddle

注意:正如@Ice所建议的,如果金额字段包含非数字数据,例如

ab123
xyz
(显然),这将失败。


17
投票

尝试

ABS()

SELECT * FROM MyTable ORDER BY ABS(MyCol) DESC;

SQL 小提琴


3
投票

试试这个

SELECT *
FROM #varchar_field
ORDER BY 
    CASE 
        WHEN ISNUMERIC(mixed_field) = 1 THEN CAST(mixed_field AS FLOAT)
        WHEN ISNUMERIC(LEFT(mixed_field,1)) = 0 THEN ASCII(LEFT(LOWER(mixed_field),1)) 
        ELSE 2147483647
    END

参考:http://sqlserverplanet.com/tsql/how-to-order-numeric-values-in-a-varchar-field

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.