我正在使用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
答案 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