T-SQL:在加入

时间:2016-10-10 15:38:15

标签: sql-server tsql ansi-sql

我正在使用SQL查询,我需要根据ISNUMERIC返回值进行过滤。 ISNUMERIC很重要,因为在我的连接中,我隐式地将值转换为" int",因此VARCHAR是禁止的。

我已经查看了应该处理查询的顺序,然后处理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

2 个答案:

答案 0 :(得分: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 :(得分: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