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

Откуда: Київ
Сообщений: 59
Добрый день.
с написаниями функций ещё не работала, поэтому такой вопрос - какой аналог case можно использовать в функции?
есть 3 входных параметра, в зависимости от их значения присваивается значение результирующему параметру.
дело в том, что проверка по значениям должна идти как в case - если первое условие выполнено, дальше не проверять.

в голову пришел только вариант ниже, но он не катит:)


ALTER FUNCTION [dbo].[GetDep]
(
@a int,
@b int,
@c int
)
RETURNS nvarchar(20)
AS
BEGIN

if @a ...
set @dep = 1

if @b...
set @dep =2

if @c ...
set @dep = 3

eLSE
set @dep = 4

return (@dep)

END
18 дек 14, 15:22    [17017673]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
какой аналог case можно использовать в функции?

Вопрос неправильный
CASE - это функция, которую можно использовать в любом запросе. Независимо от того, где этот запрос существует
18 дек 14, 15:24    [17017685]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
Зачем тут скалярная функция? Для торможения?
SET @dep=CASE WHEN @a... THEN 1 WHERE @b... THEN 2 WHEN @c... THEN 3 ELSE 4 END;
18 дек 14, 15:26    [17017701]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
нашла уже лажу, спасибо:)
проблема была не в кейсе в функции, а в правильности присвоении параметру значения кейса
18 дек 14, 15:27    [17017708]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
AlesandraFioni
нашла уже лажу, спасибо:)
проблема была не в кейсе в функции, а в правильности присвоении параметру значения кейса
Говорят же Вам, выбросить надо UDF куда подальше
18 дек 14, 15:28    [17017724]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
iap, нет, функция мне все-таки нужна, так как такой кейс (не такой правда, а в пару десятков раз больше:)) используется в 10 разныз местах, и при каждом изменении кейса, надо будет менять в каждой процедуре и запросе это дело.
18 дек 14, 15:32    [17017753]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8301
AlesandraFioni,
только потом не приходите с вопросом "почему сервер медленно работает".
18 дек 14, 15:45    [17017820]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
используется в 10 разныз местах, и при каждом изменении кейса, надо будет менять в каждой процедуре и запросе это дело.

У вас еще и проектирование хромает
18 дек 14, 15:47    [17017833]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Владислав Колосов, постараюсь :)

а какой тогда ещё есть вариант, если это громоздкий кейс, есть в более десятка разных мест, достаточно часто приходиться менять?
кроме функции, и кроме держать кейс в запросах и процедурах?
18 дек 14, 15:48    [17017837]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
а какой тогда ещё есть вариант, если это громоздкий кейс, есть в более десятка разных мест, достаточно часто приходиться менять?
кроме функции, и кроме держать кейс в запросах и процедурах?

Таблица
18 дек 14, 15:49    [17017844]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8301
AlesandraFioni, а что мешает создать таблицу-справочник перекодировки?
18 дек 14, 15:50    [17017853]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory, вот же и пытаюсь исправить:)
18 дек 14, 15:50    [17017857]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8301
Никогда не занимайтесь хардкодом, пишите масштабируемые приложения.
18 дек 14, 15:51    [17017860]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
Glory, вот же и пытаюсь исправить:)

Вы написание дополнительной функции называеет "исправить" ?
18 дек 14, 15:52    [17017864]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Таблица не катит, так как исходные данные пополняются ежедневно, и в зависимости от трёх параметров, надо их отнести к одной из четырёх груп.
зависимость от трёх параметров может изменятся, исходные данные меняются, могут группы добавляться/убавляться - каждый раз перезаливать таблицу не самый лучший выход, как мне кажется...
18 дек 14, 16:10    [17017994]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
Таблица не катит, так как исходные данные пополняются ежедневно, и в зависимости от трёх параметров, надо их отнести к одной из четырёх груп.

Мда
Вам и нужно создать таблицу для этих "четырех групп"
18 дек 14, 16:12    [17018008]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

я, по-ходу, или как-то неправильно объясняю или жестоко туплю:(

не понимаю, какую таблицу я могу создать.

data fil store contragent id type
2014-09-261695 171726577159
2014-09-261695 1717 26577360
2014-09-261695 171726577859
2014-09-261695 191926600160
2014-09-261738 19765374610
2014-09-27131197612898310



например, по таблице выше, надо отнести строки к одной из 4 групп по такому кейсу:

case when id in (select id from Table1) then 'group1'
when store in (16,17) and id in (select id from table2) then 'group2'
when id in (select id from table3) and fil in (select fil from table4) then 'group3'
else 'group4'
end



какая таблица для 4 групп здесь поможет?
18 дек 14, 16:32    [17018152]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
какая таблица для 4 групп здесь поможет?

Здесь вообще должны быть join-ы
А не подзапросы, которые выполняются каждый раз для каждой строки
18 дек 14, 16:36    [17018175]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

да не в этом дело же.
джойны есть, я для примера проще решила сделать:)
но вопрос остается - какая таблица здесь поможет?
18 дек 14, 16:41    [17018223]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
но вопрос остается - какая таблица здесь поможет?

Ваш последнйи пример значительно отличается от изначального
ALTER FUNCTION [dbo].[GetDep]
(
@a int, 
@b int,
@c int
)
RETURNS nvarchar(20)
AS
BEGIN

if @a ...
set @dep = 1

if @b...
set @dep =2

if @c ...
set @dep = 3

eLSE
set @dep = 4

return (@dep)

END

А для вашего случая интересно что будет, если для какой-то записи выполнится условия более одного условия
18 дек 14, 16:43    [17018239]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

ну если я не ошибаюсь - то кейс присваивает то значение, которое первое подошло? то есть если выполнилось первое условие, то второе уже не проверяется. или это не так?
18 дек 14, 16:47    [17018263]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

именно поэтому пример мне и не подходил, потому что для значения могут подходить под несколько условий:)
18 дек 14, 16:48    [17018271]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
именно поэтому пример мне и не подходил, потому что для значения могут подходить под несколько условий:)

Ага. Написание универсальной функции "определения группы" рано или поздно приведет в тупик. Не говоря уже о производительности
18 дек 14, 16:50    [17018284]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
AlesandraFioni
Member

Откуда: Київ
Сообщений: 59
Glory,

почему?

я и так уже в тупике...
18 дек 14, 16:52    [17018295]     Ответить | Цитировать Сообщить модератору
 Re: case в пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
AlesandraFioni
почему?

Потому что универсальные вещи работают хуже специализированных.

AlesandraFioni
я и так уже в тупике...

Вам нужна одна процедура. Которая один раз определит группу для каждой записи и занесет ее в соответствующее поле. И больше не будет никаких функций функция для "определения группы"
18 дек 14, 16:56    [17018335]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить