powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вызов функции в select внутри case как работает ?
12 сообщений из 12, страница 1 из 1
Вызов функции в select внутри case как работает ?
    #40062273
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть функция, которая отрабатывает, допустим, 1 сек.
Заметил что при вызове ее в селекте в конструкции case запрос отрабатывает медленнее чем если ее просто вызвать 1 раз, т.е.

Код: sql
1.
2.
3.
4.
5.
6.
7.
select dbo.Func -- быстрее

select
case when dbo.Func = 1 then 1
       when dbo.Func = 2 then 2
       when dbo.Func = 3 then 3
end -- чем это



значит ли это то что на обработку case потребуется 3 секунды (на каждый when)? и как в таком случае быстрее обработать результат функции не используя подзапрос такого вида

Код: sql
1.
2.
3.
4.
5.
6.
select 
case when tab.func_result = 1 then 1
	when tab.func_result = 2 then 2
	when tab.func_result = 3 then 3
end
from(select dbo.Func as func_result) tab



Приму в дар любое просвещение по данной ситуации
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40062279
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ol_chig

значит ли это то что на обработку case потребуется 3 секунды (на каждый when)? и как в таком случае быстрее обработать результат функции не используя подзапрос такого вида

Функция - скалярная?
Да, именно это и значит, функция будет вызвана 3 раза.

Да, именно так, как Вы написали и нужно поступать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
case when tab.func_result = 1 then 1
	when tab.func_result = 2 then 2
	when tab.func_result = 3 then 3
end
from <таблица по которой строится запрос>
Cross apply (Values (dbo.Func(<тут возможна передача параметров из секции from>) )) as tab(func_result)
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40062286
ol_chig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
uaggster
ol_chig

значит ли это то что на обработку case потребуется 3 секунды (на каждый when)? и как в таком случае быстрее обработать результат функции не используя подзапрос такого вида

Функция - скалярная?
Да, именно это и значит, функция будет вызвана 3 раза.

Да, именно так, как Вы написали и нужно поступать:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
case when tab.func_result = 1 then 1
	when tab.func_result = 2 then 2
	when tab.func_result = 3 then 3
end
from <таблица по которой строится запрос>
Cross apply (Values (dbo.Func(<тут возможна передача параметров из секции from>) )) as tab(func_result)


Да, функция скалярная.

Совсем забыл про cross apply, спасибо! Это куда лучше писанины с подзапросами
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40062310
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ol_chig

значит ли это то что на обработку case потребуется 3 секунды (на каждый when)?

будет вызов 3 раза в случае, если первые 2 условия не вернут true
т.е в case доходит до первого условия, которое сработает и выходит

ol_chig

Код: sql
1.
2.
3.
4.
5.
6.
select 
case when tab.func_result = 1 then 1
	when tab.func_result = 2 then 2
	when tab.func_result = 3 then 3
end
from(select dbo.Func as func_result) tab



Приму в дар любое просвещение по данной ситуации


можно обойтись одним вызовом
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
case tab.func_result 
        when  1 then 1
	when 2 then 2
	when 3 then 3
end
from(select dbo.Func as func_result) tab
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40062806
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кросс аплай вообще-то хуже подзапроса
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064072
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot

будет вызов 3 раза в случае, если первые 2 условия не вернут true
т.е в case доходит до первого условия, которое сработает и выходит

Вызов 3 раза - будет независимо от того сколько и чего там будет возвращено.
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064073
zby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

нет
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064077
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zby
uaggster,

нет

Да. :-)
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064085
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
zby
uaggster,

нет

Да. :-)

И у вы конечно можете привести какой-либо пруф, подтверждающий ваше утверждение?


Достаточно глянуть план запроса, и там почти наверняка будет 1 compute scalar с вычислением значения этой функции.
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064087
zby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,
Вот точно
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064088
zby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zby,

case так вообще не работает, еще можно поспорить на тему майскросовстовского iif ранних версий, но это уже другая тема
...
Рейтинг: 0 / 0
Вызов функции в select внутри case как работает ?
    #40064774
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
HandKot

будет вызов 3 раза в случае, если первые 2 условия не вернут true
т.е в case доходит до первого условия, которое сработает и выходит

Вызов 3 раза - будет независимо от того сколько и чего там будет возвращено.


Выражение CASE (Transact-SQL)

Remarks
Выражение CASE последовательно оценивает свои условия и останавливается, когда находит первое выполнимое условие. В некоторых ситуациях выражение оценивается до того, как выражение CASE получает результаты выражения в качестве входных данных. При оценке этих выражений возможны ошибки. Агрегатные выражения в аргументах WHEN выражения CASE вначале оцениваются, после чего передаются выражению CASE.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вызов функции в select внутри case как работает ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]