2016-10-10 64 views
1

我正在使用SQL查詢,因此我需要根據ISNUMERIC返回值進行篩選。 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

在=符號的任一側的JOIN中加入CASE語句以測試IsNumberic()。 –

+0

在「PlzVon」或「PlzBis」列中,您是否有類似於''5.1','1.4e1','4d9'的數據? –

回答

1

難道你們就不能只是把isnumeric到您的on標準是什麼?

這個工作對我來說:

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