Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написать Inline table-valued function, с условием IF ... ELSE 
:(
    Опции темы
sergey_85
Дата 15.5.2011, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 17.4.2007
Где: Россия, Челябинск

Репутация: нет
Всего: 1



Привет!

Нужно реализовать такой запрос:

Код

select ... from ... where field in (dbo.fn_GetList(@param1))


Дело в том, что dbo.fn_GetList(@param1) должна возвращать в in  разные select'ы, в  зависимости от параметра ф-ции. 
Реализовать такое через процедуру не получиться, остаётся вариант с Inline table-valued function.


Но здесь непонятки, можно ли в теле Inline table-valued function ф-ции использовать конструкции IF ... ELSE, чтобы возвращать разный select, если нет, то как "выйти из ситуации", чтобы вызов работал в запросе с in?

Спасибо!

Это сообщение отредактировал(а) sergey_85 - 15.5.2011, 22:50


--------------------
A good design always pays off.
PM MAIL   Вверх
pengrad
Дата 1.6.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pengrad



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 23.2.2009
Где: Москва

Репутация: нет
Всего: нет



Привет, даже не надо исхитряться. Твой select всегда должен возвращать одну колонку, именно так работает in(). Поэтому смело можно использовать обычную табличную функцию:

Код

create function dbo.fn_GetList(@param int)
returns @t TABLE (field int)
AS
begin    
    
    insert @t values(1)
    insert @t values(2)
    
    if (@param = 2) begin
      insert @t values(3)
      insert @t values(4)
    end
    
    return
end


Ну, и соответственно подправить немного вызов:

Код

select ... from ... where field in (select field dbo.fn_GetList(@param1))

PM MAIL   Вверх
Любитель
Дата 18.6.2011, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Код

select *
from t1
where t1.f1 in
(
  select t2.f1
  from t2
  where @param = 1

  union all

  select t3.f1
  from t3
  where @param = 2
)


Зачем дополнительная функция в данном случае?


--------------------
PM MAIL ICQ Skype   Вверх
pengrad
Дата 27.6.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pengrad



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 23.2.2009
Где: Москва

Репутация: нет
Всего: нет



Так красивей с функцией, нет?)
PM MAIL   Вверх
Любитель
Дата 28.6.2011, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Нет. А с мультилайновой функцией - ещё и гарантировано медленнее.

Добавлено через 2 минуты и 26 секунд
По вопросу сабжа:
Цитата(sergey_85 @  15.5.2011,  22:48 Найти цитируемый пост)
Но здесь непонятки, можно ли в теле Inline table-valued function ф-ции использовать конструкции IF ... ELSE, чтобы возвращать разный select, если нет, то как "выйти из ситуации", чтобы вызов работал в запросе с in?

Именно if/else (императивные конструкции) - нельзя. Смысл инлайновой функции именно в том, что её можно заинлайнить, подставить в запрос (т. е. всегда можно обойтись без неё - тут просто вопрос, что быть может хочется дублирования избежать).


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1078 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.