こんにちは私は異なるテーブルの2つの列を比較することを想定したストアドプロシージャを持っています
- Users.ID => int
- Trans.ID => nvarchar
Trans.IDの値がまったく数値でない場合もあれば、nullの場合もあり、比較しようとするとエラーが発生します。
Trans.IDを数値に解析しようとする方法はありますか?それが0を返すことに成功しない場合は??
試しNullIf()
ましたが、中の値が数値でない場合は動作しません。
こんにちは私は異なるテーブルの2つの列を比較することを想定したストアドプロシージャを持っています
Trans.IDの値がまったく数値でない場合もあれば、nullの場合もあり、比較しようとするとエラーが発生します。
Trans.IDを数値に解析しようとする方法はありますか?それが0を返すことに成功しない場合は??
試しNullIf()
ましたが、中の値が数値でない場合は動作しません。
Trans.IDがフィールドであるとすると、フィールドをvarcharにvarchar(20)
変換し、NULL値の処理に使用して、次のように比較できます。Users.ID
COALESCE
WHERE CAST(Users.ID AS varchar(20)) = COALESCE(Trans.ID, '')
SQLサーバーを使用している場合は、これを行うことができます
CASE WHEN ISNUMERIC(Trans.ID) = 0 then null
else cast(Trans.ID as int) end = Users.ID
あなたは次のようなことをすることができます:
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)
お役に立てれば。
それが単なる平等比較である場合(私はそれが理にかなっていると思います)、私はに変換Users.ID
してからNVARCHAR
と比較しTrans.ID
ます。
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