MS SQL Server 2016百分比格式化后比较结果异常问询
问题根源:字符串比较 vs 数值比较
这个问题的核心其实很直白——你用FORMAT()函数把数值转成了字符串类型的百分比,而SQL Server在比较字符串时,是按照字符的ASCII码顺序逐个对比,完全不是按数值大小来判断的!
咱们拆解你的例子具体看:
FORMAT(1.37,'P0')返回的是字符串'137%'FORMAT(0.2,'P0')返回的是字符串'20%'
当比较这两个字符串时,SQL Server会从第一个字符开始逐一对比:第一个字符是'1'和'2','1'的ASCII码(49)比'2'(50)小,所以直接判定'137%' < '20%'为真,返回'y'。
为什么低于100%时看起来“正常”?
你说低于100%时结果正常,大概率是你测试的都是两位数的百分比(比如0.5→'50%'、0.3→'30%'),这时候第一个字符的大小和数值大小刚好一致('5' > '3',对应50%>30%)。但如果测试个位数百分比和两位数百分比,比如FORMAT(0.09,'P0')('9%')和FORMAT(0.1,'P0')('10%'),字符串比较会得到'9%' > '10%',但实际数值是9% < 10%,这时候同样会出现异常!
解决方案
要避免这种问题,核心是始终用数值类型做比较,不要用格式化后的字符串:
- 最直接的方式:直接比较原始数值
SELECT IIF(1.37 < 0.2, 'y', 'n') -- 返回 'n',符合预期
- 如果必须基于格式化后的百分比字符串比较,先把它转成数值再比:
SELECT IIF( CAST(REPLACE(FORMAT(1.37,'P0'), '%', '') AS DECIMAL) < CAST(REPLACE(FORMAT(0.2,'P0'), '%', '') AS DECIMAL), 'y', 'n' ) -- 返回 'n',符合预期
内容的提问来源于stack exchange,提问作者Meredith
相关产品推荐
相关产品推荐

