2016-10-10 2 views
1

ISNUMERICの戻り値に基づいてフィルタリングする必要があるSQLクエリで作業しています。 ISNUMERICは重要です。なぜなら、私の結合時に、暗黙的に値を "int"に変換するので、VARCHARはノー・ノーです。T-SQL:結合前にISNUMERICを評価する

私はクエリが処理されるはずの命令を見て、FROMが処理されてからWHEREの前にあるONを調べました。サブクエリを使用せずに最初にISNUMERICを評価する方法がありますか?私はサブクエリに反対していない、私は思っているだけです。

SELECT l.* FROM [dbo].[CRM_SD_Working_1] l 
LEFT JOIN [dbo].[CRM_SD_Working_1] r ON l.[PlzVon] = r.[PlzBis] + 1 
WHERE 
ISNUMERIC(l.[PlzVon]) = 1 
AND ISNUMERIC(l.[PlzBis]) = 1 
AND l.PlzVon <> l.PlzBis 
AND r.ID IS NULL 
+1

その句を 'ISNUMERIC(r。[PlzBiz] = 1')にしてはいけませんか? rで。 lの代わりに? – RBarryYoung

+1

IsNumberic()をテストするために、=記号の両側のJOINにCASE文を挿入します。 –

+0

'' $ 5.1 '、' 1.4e1 '、' 4d9''に似たデータが 'PlzVon'または' PlzBis'カラムにありますか? –

答えて

1

あなたは自分のon基準にisnumericを置くことができませんか?

これは私の作品:

declare @a table(a nvarchar(10)) 
declare @b table(b nvarchar(10)) 

insert into @a values('1'),('2'),('3'),('4'),('a'),('5') 
insert into @b values('1'),('2'),('3'),('5'),('6'),('b') 

select * 
from @a a 
    left join @b b 
     on(case when isnumeric(a.a) = 1 
       then a.a 
       else null 
       end 
      = 
      case when isnumeric(b.b) = 1 
       then b.b + 1 
       else null 
       end 
      ) 

バージョン2012以降である場合は、あなたもtry_convertを使用することができます。

declare @a table(a nvarchar(10)) 
declare @b table(b nvarchar(10)) 

insert into @a values('1'),('2'),('3'),('4'),('a'),('5') 
insert into @b values('1'),('2'),('3'),('5'),('6'),('b') 

select * 
from @a a 
    left join @b b 
     on(try_convert(int, a.a) = try_convert(int, b.b)+1 
     ) 
+1

質問はb.b + 1 – Paparazzi

+1

です。両方ともnvarcharにしてチャットすると失敗します。 – Paparazzi

+0

@Paparazziヘッドアップのために乾杯、答えが更新されました。 – iamdave

0

私はこれが動作することが保証されると思いますが、作品はありませんこのデータのため
iamdaveからの回答がよかったよ

declare @a table(a varchar(10)) 
declare @b table(b varchar(10)) 

insert into @a values('1'),('2'),('3'),('4'),('5'),('6'),('c') 
insert into @b values('1'),('2'),('3'),('5'),('6'),('a') 

select * 
from 
(select a from @a where isnumeric(a) = 1) aa 
left join 
(select b from @b where isnumeric(b) = 1) bb 
on aa.a = bb.b + 1 
関連する問題