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
答
难道你们就不能只是把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
)
答
我不认为这是保证工作,但作品对于这个数据
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
该不应该是'ISNUMERIC(r。[PlzBiz] = 1'?随着r。而不是l。? – RBarryYoung
在=符号的任一侧的JOIN中加入CASE语句以测试IsNumberic()。 –
在“PlzVon”或“PlzBis”列中,您是否有类似于''5.1','1.4e1','4d9'的数据? –