我的目的是检索所有转换为 BigInt 的 CLIENT_CODE
,以与来自 400 行 SQL 查询的 where 子句中作为参数传递的值进行比较。当执行下面的代码时,我收到以下错误消息:
message error 8114 from sql server: "Error converting varchar to bigint".
测试代码:
select CASE when (len (CLIENT_CODE) > 2 and isNumeric(CLIENT_CODE) = 1)
then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT))
else CLIENT_CODE end from TABLE TAB
代码嵌套:
--HUGE_SQL...
AND ((CASE when (len (CLIENT_CODE) > 2 and isNumeric(CLIENT_CODE) = 1)
then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT))
else CLIENT_CODE end) = @MyClient_Code)
--... HUGE_SQL
我们的CLIENT_CODE
是varchar(20)
,有的有0个字符,有的有字母,但几乎每条记录都是数字。
按照我的理解,必须先评估案件,但事实似乎并非如此。
当我将 isNumeric(CLIENT_CODE) = 1
放入测试代码中的 where 子句时,它可以工作。我的问题是,在这种特殊情况下我无法做到这一点,因为事实上它已经嵌套在一个巨大的 sql 查询的 where 子句中,并且添加 isNumeric(CLIENT_CODE) = 1
并没有行不通,因为它还有很多其他条件。
检索此数据的最佳方式是什么?有人能弄清楚该怎么做吗? (对如何处理函数、案例和位置的某种解释将非常有帮助)
最佳答案
您的 Case 表达式在一种情况下返回 BIGINT
,否则返回 VARCHAR
数据类型。
对于 Case 表达式,每种情况返回的数据类型必须相同。
也不要使用 ISNUMERIC()
使用以下
select CASE
when (len (CLIENT_CODE) > 2 and CLIENT_CODE NOT LIKE '%[^0-9]%')
then (CAST(SUBSTRING(TAB.CLIENT_CODE, 1, LEN(TAB.CLIENT_CODE)-1) AS BIGINT))
end
from TABLE TAB
ISNUMERIC()
对于 123a1
、 346g2
等值返回 true,它认为它是加幂的东西,因此使用 NOT LIKE '%[^0-9]%'
获取仅存在实际数值的字符串。
关于sql-server - 在非常特殊的情况下将 varchar 转换为 bigint 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25392602/