2016-10-10 6 views
1

Я работаю с SQL-запросом, в котором мне нужно фильтровать на основе возвращаемого значения ISNUMERIC. ISNUMERIC важен, потому что в моем соединении я неявно преобразовываю значение в «int», поэтому VARCHAR - это нет-нет.T-SQL: Оценить ISNUMERIC перед соединением

Я рассмотрел порядок, в котором должны обрабатываться запросы, и обрабатывается FROM, а затем ON, которая находится перед WHERE. Есть ли способ, который я могу предложить, чтобы ISNUMERIC был оценен сначала БЕЗ использования подзапроса? Я не против Sub-Queries, мне просто интересно.

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

Поместите оператор CASE в JOIN по обе стороны от знака =, чтобы проверить IsNumberic(). –

+0

У вас есть данные, аналогичные этим '' $ 5.1 ',' 1.4e1 ',' 4d9'' в столбце 'PlzVon' или' PlzBis'? –

ответ

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 и поместить чат в a, и это не сработает – 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