Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 последовательность исполнения вычислений и проверки предикатов  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Такой запрос...

select (cast(T.TextValue as int))
from SomeTable T
where isnumeric(T.TextValue) = 1

Объясните, почему сиквел через раз сначала кастит, и только потом уже фильтрует?
Это сильно мешает жить в тех случаях, когда поле TextValue содержит НЕчисла...

Спс.
13 сен 11, 14:40    [11269621]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сделайте вычисляемой поле с индексом - и не будет больше.
13 сен 11, 14:43    [11269656]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
RubinDm,

засуньте фильтрацию в подзапрос.
13 сен 11, 14:45    [11269672]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
кластерный удалятор
RubinDm,

засуньте фильтрацию в подзапрос.
Не поможет!
Единственный способ - использовать CASE,
для которого документирован порядок проверок условий
и прекращение обработки на первом подходящем.

Но в данном случае много и других тонкостей.
ISNUMERIC не гарантирует преобразуемость в целый тип.
А только в ЛЮБОЙ числовой!
13 сен 11, 14:50    [11269730]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
10477412
13 сен 11, 14:53    [11269768]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
iap,

кастоваться будет результат фильтрации
13 сен 11, 15:02    [11269846]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
кластерный удалятор
iap,

кастоваться будет результат фильтрации
Нет.

Оформление поздапроса не указывает серверу порядок посроения плана.

Это независимые вещи, подзапрос определяет только семантику запроса.
13 сен 11, 15:06    [11269889]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
alexeyvg,

select cast(T.TextValue as int)
from
(
select TextValue 
from SomeTable T
where isnumeric(T.TextValue) = 1
) t

отвалится с Conversion failed, так?
13 сен 11, 15:19    [11269999]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
кластерный удалятор
alexeyvg,

select cast(T.TextValue as int)
from
(
select TextValue 
from SomeTable T
where isnumeric(T.TextValue) = 1
) t
отвалится с Conversion failed, так?
Этот запрос скорее всего не отвалится, тут же нету дополнительных условий.

Так же не отвалится и:
select cast(T.TextValue as int)
from SomeTable T
where isnumeric(T.TextValue) = 1

Мы же не о таких случаях говорим, ТС привёл упрощённый вариант запроса.
13 сен 11, 15:26    [11270060]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
кластерный удалятор
alexeyvg,

select cast(T.TextValue as int)
from
(
select TextValue 
from SomeTable T
where isnumeric(T.TextValue) = 1
) t

отвалится с Conversion failed, так?

Ровно с той же вероятностью, что и без подзапроса.
13 сен 11, 15:26    [11270069]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
iljy,

какие опции нужно указать/создать какой-то индекс/что-то еще чтобы отвалился?
13 сен 11, 15:57    [11270358]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
кластерный удалятор
iljy,

какие опции нужно указать/создать какой-то индекс/что-то еще чтобы отвалился?

Поищите по форуму, тема регулярно всплывает.
13 сен 11, 15:58    [11270363]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
iljy,

ну понятно.
13 сен 11, 16:04    [11270414]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
Евгений Кириченко
Member

Откуда:
Сообщений: 10
кластерный удалятор,

Это не считая того, что cast(T.TextValue as int) может отвалиться, даже если предикат во Where отработал первым.

iap же приводил ссылку на правильный способ преобразования к int.
13 сен 11, 16:05    [11270417]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
Евгений Кириченко,

правильный? ))
13 сен 11, 16:12    [11270478]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
кластерный удалятор
Евгений Кириченко,

правильный? ))

Именно
declare @t table(TextValue varchar(100))
insert @t values('+'),('.'),('99999999999999999999999999999999999999999999999999999')
select cast(T.TextValue as int)
from
(
	select TextValue 
	from @t T
	where isnumeric(T.TextValue) = 1
) t
13 сен 11, 16:15    [11270508]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
А самое правильное - не хранить числовые данные в текстовых полях!
13 сен 11, 16:18    [11270533]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
iljy,

я как раз об этом. нигде не сказано что там вобще хранится, про запятые ТС не спрашивал.
13 сен 11, 16:23    [11270578]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
кластерный удалятор
iljy,

я как раз об этом. нигде не сказано что там вобще хранится, про запятые ТС не спрашивал.

О чем об этом? У ТС хранятся Не числа, он это сам сказал. Вариант iap это учитывает, чем вы не довольны?
13 сен 11, 16:25    [11270609]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
кластерный удалятор
Guest
iljy,

условия задачи неизвестны и слово "правильный" здесь неуместно.

с таким же успехом может оказаться более правильным падать на нецелых числах.
13 сен 11, 16:31    [11270675]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
RubinDm
Member

Откуда:
Сообщений: 461
iap
Единственный способ - использовать CASE, для которого документирован порядок проверок условий и прекращение обработки на первом подходящем.

Я не уверен, что это единственный способ. И вообще этот способ я пробовал - не работает. Кастинг все равно исполняется в первую очередь, до фильтрации.

iap
Но в данном случае много и других тонкостей. ISNUMERIC не гарантирует преобразуемость в целый тип. А только в ЛЮБОЙ числовой!

Да, но на данный момент это наименьшая из проблем, ибо в моем реальном проекте каст делается не в int, а в decimal.

зы: поиграл с cross apply'ами, select top'ами 1й записи и т.п., вроде заработало. Но код при этом реально изуродовало. Если кому интересно - могу показать.
13 сен 11, 16:41    [11270768]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
RubinDm
Я не уверен, что это единственный способ. И вообще этот способ я пробовал - не работает. Кастинг все равно исполняется в первую очередь, до фильтрации.

Внутри CASE выполняется до проверки условия??? Врете, не может такого быть.
13 сен 11, 16:48    [11270815]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
RubinDm
Member

Откуда:
Сообщений: 461
автор
Внутри CASE выполняется до проверки условия???

Именно так. Я так понимаю, что время, место и способ расчета конечного результата - это все на усмотрение движка. И если ему (движку) покажется, что каст - это типа как бы "бесплатно", то заморачиваться фильтрацией ДО каста он просто не будет. Что и наблюдается. Еще изучение данного вопроса в инете привело меня к тому, что так делает далеко не только сиквел. Видимо, объяснение этому заключается в том, что для исправления ситуации разработчикам двигла пришлось бы как-то маркировать все операции, или хранить справочники пар, аля (cast <--> isnumeric), с тем, чтобы в процессе анализа запроса искать в нем такие пары и разруливать предфильтрацию самостоятельно. Будь я на месте разработчика - я бы сказал что-то типа "извините, вы конечно правы, так надо делать, но это нифига не вписывается в обую концепцию".
автор
Врете, не может такого быть.

Полегче на поворотах ;]
13 сен 11, 21:44    [11272357]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
iljy
Member

Откуда:
Сообщений: 8711
RubinDm
автор
Внутри CASE выполняется до проверки условия???

Именно так. Я так понимаю, что время, место и способ расчета конечного результата - это все на усмотрение движка. И если ему (движку) покажется, что каст - это типа как бы "бесплатно", то заморачиваться фильтрацией ДО каста он просто не будет. Что и наблюдается. Еще изучение данного вопроса в инете привело меня к тому, что так делает далеко не только сиквел. Видимо, объяснение этому заключается в том, что для исправления ситуации разработчикам двигла пришлось бы как-то маркировать все операции, или хранить справочники пар, аля (cast <--> isnumeric), с тем, чтобы в процессе анализа запроса искать в нем такие пары и разруливать предфильтрацию самостоятельно. Будь я на месте разработчика - я бы сказал что-то типа "извините, вы конечно правы, так надо делать, но это нифига не вписывается в обую концепцию".
автор
Врете, не может такого быть.

Полегче на поворотах ;]

Фильтрацией - не будет, потому что порядок вычисления списка SELECT физически не регламентирован. Но поведение CASE четко документировано, и выполнить ветку then до проверки условия when он просто не может. Так что приводите пример или пруфлинк.
13 сен 11, 23:54    [11272718]     Ответить | Цитировать Сообщить модератору
 Re: последовательность исполнения вычислений и проверки предикатов  [new]
RubinDm
Member

Откуда:
Сообщений: 461
iljy
Так что приводите пример или пруфлинк.

Ээм.. пруфлинк - это как?
14 сен 11, 16:17    [11276731]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить