0

嗨,我有一个存储过程,假设在不同表上的 2 列之间进行比较

  1. 用户.ID => int
  2. Trans.ID => nvarchar

有时 Trans.ID 中的值根本不是数字,有时它是 null,这会导致尝试比较时出错

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

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

4

5 回答 5

3

如果使用 sql server 你可以这样做

CASE WHEN ISNUMERIC(Trans.ID) = 0  then null 
else cast(Trans.ID as int) end = Users.ID
于 2012-10-01T14:00:22.987 回答
3

假设 Trans.ID 是一个varchar(20)字段,可以将Users.ID字段转换为 varchar,用于COALESCE处理 NULL 值,比较如下:

WHERE CAST(Users.ID AS varchar(20)) = COALESCE(Trans.ID, '')
于 2012-10-01T13:59:54.443 回答
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)

希望这可以帮助。

于 2012-10-01T14:00:01.367 回答
0

IsNumeric() 并不总是正确的,例如 ' - ' 和 '.' 两者都为 IsNumeric 返回 1,但会使您的查询失败。

此功能(改编自此处

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
于 2012-10-01T14:05:18.697 回答
0

如果只是相等比较(我认为这是有道理的),我会转换Users.IDNVARCHAR然后与Trans.ID.

于 2012-10-01T14:00:47.917 回答