0

こんにちは私は異なるテーブルの2つの列を比較することを想定したストアドプロシージャを持っています

  1. Users.ID => int
  2. Trans.ID => nvarchar

Trans.IDの値がまったく数値でない場合もあれば、nullの場合もあり、比較しようとするとエラーが発生します。

Trans.IDを数値に解析しようとする方法はありますか?それが0を返すことに成功しない場合は??

試しNullIf()ましたが、中の値が数値でない場合は動作しません。

4

5 に答える 5

3

Trans.IDがフィールドであるとすると、フィールドをvarcharにvarchar(20)変換し、NULL値の処理に使用して、次のように比較できます。Users.IDCOALESCE

WHERE CAST(Users.ID AS varchar(20)) = COALESCE(Trans.ID, '')
于 2012-10-01T13:59:54.443 に答える
3

SQLサーバーを使用している場合は、これを行うことができます

CASE WHEN ISNUMERIC(Trans.ID) = 0  then null 
else cast(Trans.ID as int) end = Users.ID
于 2012-10-01T14:00:22.987 に答える
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

それが単なる平等比較である場合(私はそれが理にかなっていると思います)、私はに変換Users.IDしてからNVARCHARと比較しTrans.IDます。

于 2012-10-01T14:00:47.917 に答える
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 に答える