Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 case in when  [new]
йоптырь
Guest
можно ли сделать
case in ('A','B','C')
       when field1  then 1
       when field2  then 1
       when field3  then 1
       when field4  then 1
       when field5  then 1
       when field6  then 1
       when field7  then 1
else 0
from table...n

??
пример для понимания маленький, но у меня множество when
и делать
case 
       when field1  in ('A','B','C') then 1
       when field2  in ('A','B','C') then 1
       when field3  in ('A','B','C') then 1
       when field4  in ('A','B','C') then 1
       when field5  in ('A','B','C') then 1
       when field6  in ('A','B','C') then 1
       when field7  in ('A','B','C') then 1
else 0
from table...n

весьма не красиво выглядит скрипт. пусть я эстет, но вот как-то вот так
сеньк
3 сен 13, 11:10    [14788239]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
SELECT ISNULL((SELECT TOP(1) 1 FROM(VALUES(field1),(field2),(field3),(field4),(field5),(field6),(field7))T(F)WHERE F IN('A','B','C')),0)
FROM [Table]
Так красиво?

SQL потребуется >=2008
3 сен 13, 11:24    [14788334]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
Не проще ли Вам сделать функцию которая вернет нужный результат, и в дальнейшем использовать ее при необходимости во всех запросах

SELECT dbo.FUNC(field1) as field1,.... dbo.FUNC(fieldN) as fieldN FROM ....
3 сен 13, 11:34    [14788415]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31439
DmitryVT
Не проще ли Вам сделать функцию которая вернет нужный результат, и в дальнейшем использовать ее при необходимости во всех запросах

SELECT dbo.FUNC(field1) as field1,.... dbo.FUNC(fieldN) as fieldN FROM ....
Убийство производительности.
3 сен 13, 11:42    [14788465]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
DmitryVT
Member

Откуда: VRN
Сообщений: 192
alexeyvg,

а можно чуть подробнее, я сам новичок и хотелось бы учесть этот факт в дальнейшем.

Заранее огромное спасибо
3 сен 13, 11:44    [14788485]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
DmitryVT
alexeyvg,

а можно чуть подробнее, я сам новичок и хотелось бы учесть этот факт в дальнейшем.

Заранее огромное спасибо
Скалярная функция будет вызываться по несколку раз на каждую строку таблицы.
Во-первых, скалярная UDF - это тормоз сама по себе.
Во-вторых, строк в таблице может быть очень-очень много.
3 сен 13, 12:16    [14788672]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Exproment
Member

Откуда:
Сообщений: 416
iap, alexeyvg,
К мнениям выше доавлю, что
1) скалярная функция не дает распараллеливать запросы
2) скалярная функция может мешать адекватно оценивать кардинальность

DmitryVT, Конкретно в вашем случае я бы задумался над persisted column или view(реальная суть задачи не была названа)
3 сен 13, 12:27    [14788731]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Exproment
Member

Откуда:
Сообщений: 416
iap
Скалярная функция будет вызываться по несколку раз на каждую строку таблицы.

насколько я помню, несколько раз с одинаковым входных контентом для одной строки будет вызвана только недетрминированная функция. В случае детеминированной функции будет задан expression через compute scalar
3 сен 13, 12:30    [14788754]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Exproment
iap
Скалярная функция будет вызываться по несколку раз на каждую строку таблицы.

насколько я помню, несколько раз с одинаковым входных контентом для одной строки будет вызвана только недетрминированная функция. В случае детеминированной функции будет задан expression через compute scalar
Так в функцию для каждой строки передаётся каждое из семи разных полей по отдельности?
Какая разница, детерминированная функция или нет?
3 сен 13, 13:00    [14788960]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Гость333
Member

Откуда:
Сообщений: 3683
йоптырь
пусть я эстет

Ага, а особенно эстетским выглядит никнейм
3 сен 13, 13:33    [14789175]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Exproment
Member

Откуда:
Сообщений: 416
iap, это был простое оффтоп-дополнение к многократный вызовам) В рамках данной темы оно бесполезно, согласен!
3 сен 13, 13:33    [14789177]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Glory
Member

Откуда:
Сообщений: 104760
case when field1+field2+field3+field4+field5+field6+field7 LIKE '%[A-C]%' then 1 else 0
3 сен 13, 13:39    [14789211]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
case when field1+field2+field3+field4+field5+field6+field7 LIKE '%[A-C]%' then 1 else 0

Подойдёт разве что для полей char(1) not null, т.к. выдаст неправильные результаты для случаев field1 = 'AB', field3 = NULL и т.п.
3 сен 13, 13:56    [14789315]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость333
Glory
case when field1+field2+field3+field4+field5+field6+field7 LIKE '%[A-C]%' then 1 else 0


Подойдёт разве что для полей char(1) not null, т.к. выдаст неправильные результаты для случаев field1 = 'AB', field3 = NULL и т.п.
Дополнить разделителями (запятая, например) и функцией типа ISNULL()
3 сен 13, 13:58    [14789324]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
Гость333
пропущено...

Подойдёт разве что для полей char(1) not null, т.к. выдаст неправильные результаты для случаев field1 = 'AB', field3 = NULL и т.п.
Дополнить разделителями (запятая, например) и функцией типа ISNULL()

Не очень понял, как разделители помогут в случае field1 = 'AB' (остальные поля пусть будут равны, ну, скажем, 'D').
3 сен 13, 14:15    [14789414]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Гость333
iap
пропущено...
Дополнить разделителями (запятая, например) и функцией типа ISNULL()

Не очень понял, как разделители помогут в случае field1 = 'AB' (остальные поля пусть будут равны, ну, скажем, 'D').
case
 when
  ISNULL(','+field1,'')
 +ISNULL(','+field2,'')
 +ISNULL(','+field3,'')
 +ISNULL(','+field4,'')
 +ISNULL(','+field5,'')
 +ISNULL(','+field6,'')
 +ISNULL(','+field7,'')
 +','
 LIKE '%,[A-C],%'
 then 1
 else 0
end
3 сен 13, 14:20    [14789449]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Диапазон в шаблоне для LIKE тоже надо с осторожностью применять.
Лучше все символы в явном виде перечислить
3 сен 13, 14:21    [14789456]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Гость333
Member

Откуда:
Сообщений: 3683
iap
case
 when
  ISNULL(','+field1,'')
 +ISNULL(','+field2,'')
 +ISNULL(','+field3,'')
 +ISNULL(','+field4,'')
 +ISNULL(','+field5,'')
 +ISNULL(','+field6,'')
 +ISNULL(','+field7,'')
 +','
 LIKE '%,[A-C],%'
 then 1
 else 0
end

Ясно. Я лично предпочту "неэстетичный", зато понятный, вариант из стартового поста, чем гадать потом, какая же логика тут имелась в виду :-)
3 сен 13, 14:25    [14789484]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
йоптырь,

(+100500 к Гость333)

чем вам "некрасив" ваш исходный скрипт? с первого взгляда все ясно и наглядно.
3 сен 13, 14:56    [14789679]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
StarikNavy
йоптырь,

(+100500 к Гость333)

чем вам "некрасив" ваш исходный скрипт? с первого взгляда все ясно и наглядно.
Не исходный, а второй, наверно?
3 сен 13, 15:02    [14789717]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Диапазон в шаблоне для LIKE тоже надо с осторожностью применять.
Лучше все символы в явном виде перечислить

declare @t table (f1 nvarchar(10), f2 nvarchar(10), f3 nvarchar(10), f4 nvarchar(10))
insert into @t (f1,f2,f3,f4) select 'C', 'B', '1', 'A'
select
case
 when
  ISNULL(','+f1,'')
 +ISNULL(','+f2,'')
 +ISNULL(','+f3,'')
 +ISNULL(','+f4,'')
 +','
 LIKE '%,[A-C],%'
 then 1
 else 0
end

from @t
3 сен 13, 15:12    [14789774]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Maxx
iap
Диапазон в шаблоне для LIKE тоже надо с осторожностью применять.
Лучше все символы в явном виде перечислить

declare @t table (f1 nvarchar(10), f2 nvarchar(10), f3 nvarchar(10), f4 nvarchar(10))
insert into @t (f1,f2,f3,f4) select 'C', 'B', '1', 'A'
select
case
 when
  ISNULL(','+f1,'')
 +ISNULL(','+f2,'')
 +ISNULL(','+f3,'')
 +ISNULL(','+f4,'')
 +','
 LIKE '%,[A-C],%'
 then 1
 else 0
end

from @t
А что не так?
Там COLLATE какой-нибудь пропущен?
3 сен 13, 15:16    [14789802]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap,

да все ок, ето я перемудрил... работает как и первый (второй в первом посте) вариант с ошибкой для цифр
3 сен 13, 15:25    [14789858]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Maxx
iap,

да все ок, ето я перемудрил... работает как и первый (второй в первом посте) вариант с ошибкой для цифр
Можно подобрать COLLATE так, что очевидный обывателю диапазон
на самом деле захватит много чего ещё...
Вы-то, я уверен, знаете. Это я скорее для йоптыря...
3 сен 13, 15:48    [14789943]     Ответить | Цитировать Сообщить модератору
 Re: case in when  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap, да по like уже можно супер фак писать исходя только из топиков форума
3 сен 13, 15:54    [14789980]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить