WHERE子句nvarchar转bigint报错但SELECT中运行正常问题求解
问题解决方案
报错的根本原因是SQL Server的查询优化器不保证WHERE子句中多个条件的执行顺序,也不会严格按照子查询/CTE的嵌套顺序执行逻辑。即使你提前写了字段类型过滤、非数字值过滤的条件,优化器也可能先执行CAST转换操作,遇到不符合格式的数值就抛出转换失败错误。
方法1:使用TRY_CAST(推荐,适用于SQL Server 2012及以上版本)
TRY_CAST 是SQL Server提供的安全转换函数,当值无法转换为指定类型时会返回NULL而不是抛出错误,你可以直接用它替换原来的CAST:
SELECT FieldValue FROM CARData A JOIN Fields B ON A.FieldId = B.FieldId WHERE FieldTypeId = 3 AND FieldValue IS NOT NULL AND TRY_CAST(FieldValue AS BIGINT) > 100
这种方法不需要额外加ISNUMERIC判断,转换失败返回的NULL和100比较会返回未知值,不会被纳入结果集,同时也避免了ISNUMERIC本身的误判问题(比如ISNUMERIC对$、,、.等非整数符号也会返回1,转换为BIGINT仍然会失败)。
方法2:使用CASE表达式(兼容SQL Server 2008及更早版本)
如果你的数据库版本不支持TRY_CAST,可以用CASE表达式保证判断顺序:SQL会优先执行CASE的条件判断,只有符合条件的值才会执行转换操作:
SELECT FieldValue FROM CARData A JOIN Fields B ON A.FieldId = B.FieldId WHERE FieldTypeId = 3 AND FieldValue IS NOT NULL AND CASE -- 加'e0'是为了避免ISNUMERIC误判非整数的可转换字符 WHEN ISNUMERIC(FieldValue + 'e0') = 1 THEN CAST(FieldValue AS BIGINT) ELSE NULL END > 100
内容的提问来源于stack exchange,提问作者Bitz
相关产品推荐
相关产品推荐

