SQL不同的列类型比较错误

时间:2012-10-01 13:57:45

标签: sql sql-server string comparison

您好我有一个存储过程,它假设比较不同表中的2列

  1. Users.ID => INT
  2. Trans.ID => nvarchar的
  3. 有时Trans.ID中的值根本不是数字,有时它是null,这会在尝试比较时导致错误

    有没有办法尝试将Trans.ID解析为一个数字,以防它不能成功返回0 ??

    我尝试NullIf()但是当里面的值不是数字时它不起作用。

5 个答案:

答案 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