T-SQL:在加入之前评估ISNUMERIC

问题描述:

我正在使用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'的数据? –

难道你们就不能只是把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

我不认为这是保证工作,但作品对于这个数据
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