您好我有一个存储过程,它假设比较不同表中的2列
有时Trans.ID中的值根本不是数字,有时它是null,这会在尝试比较时导致错误
有没有办法尝试将Trans.ID解析为一个数字,以防它不能成功返回0 ??
我尝试NullIf()
但是当里面的值不是数字时它不起作用。
答案 0 :(得分:3)
假设Trans.ID是varchar(20)
字段,您可以将Users.ID
字段转换为varchar,使用COALESCE
处理NULL值,并按如下方式进行比较:
WHERE CAST(Users.ID AS varchar(20)) = COALESCE(Trans.ID, '')
答案 1 :(得分:3)
如果使用sql server,你可以这样做
CASE WHEN ISNUMERIC(Trans.ID) = 0 then null
else cast(Trans.ID as int) end = Users.ID
答案 2 :(得分:1)
你可以这样做:
select * from users u
inner join trans t on u.userid = (CASE WHEN ISNUMERIC(t.id) = 1 THEN CONVERT(int, t.id) ELSE 0 END)
希望这会有所帮助。
答案 3 :(得分:0)
如果只是平等比较(我认为这是有道理的),我会将Users.ID
转换为NVARCHAR
,然后与Trans.ID
进行比较。
答案 4 :(得分:0)
IsNumeric()并不总是正确的,例如' - '和'。'两者都为IsNumeric返回1,但查询失败。
此功能(改编自here)
create function dbo.GetNumeric(@x varchar(10)) returns float as
begin
return
case
when @x is null or @x = '' then null -- blanks
when @x like '%[^0-9e.+-]%' then null -- non valid char found
when @x like 'e%' or @x like '%e%[e.]%' then null -- e cannot be first, and cannot be followed by e/.
when @x like '%e%_%[+-]%' then null -- nothing must come between e and +/-
when @x='.' or @x like '%.%.%' then null -- no more than one decimal, and not the decimal alone
when @x like '%[^e][+-]%' then null -- no more than one of either +/-, and it must be at the start
when @x like '%[+-]%[+-]%' and not @x like '%[+-]%e[+-]%' then null
else convert(float,@x)
end
end
您的查询(涉及不平等)
where users.id >= case when IsNull(dbo.GetNumeric(trans.id),0)
如果trans.id不涉及小数点
where user.id >= case when trans.id not like '%[^0-9]%' and trans.id >''
then trans.id end
当然,如果它是一个简单的相等,只需将int转换为varchar
where right(users.id,10) = trans.id