我的目的是检索转换为BigInt的所有CLIENT_CODE
,以便与400行sql查询中where子句中作为参数传递的值进行比较。执行下面的代码时,我收到以下错误消息:
来自sql server的消息错误8114:“将varchar转换为的错误 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
不起作用,因为它有一个很多其他条件。
检索此数据的最佳方法是哪种?有人能弄清楚怎么做吗? (对于如何处理函数vs case vs where where
,这将是非常有用的解释。)答案 0 :(得分:2)
您的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]%'
来获取仅存在实际数值的字符串。