Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Case в MS SQL [D7, MSSQL]


Ярослав ©   (2005-05-24 09:47:00) 

Подскажите можно ли в MS SQL пользоваться case-м для выбора определенных действий (а не для выбора значения) как в delphi например или может есть другая функция?


evvcom   (2005-05-24 15:46:00) [1]


> и чем он отличается от

одним разделителем! :)


Polevi   (2005-05-24 15:37:00) [2]

>evvcom ©   (24.05.05 15:29) [14]
и чем он отличается от

IF <condition>
 DoSomething
ELSE
IF <condition>
 DoSomething
ELSE
IF <condition>
 DoSomething
ELSE
IF <condition>
 DoSomething
ELSE
 DoNothing


evvcom   (2005-05-24 15:29:00) [3]


> а ни чего подобного в MS SQL нет?

IF ... ELSE ...

А в Oracle еще есть ELSEIF - немного покрасивее будет.


Ярослав   (2005-05-24 12:46:00) [4]

>> evvcom ©   (24.05.05 12:11) [11]
Это я и хотел узнать, а ни чего подобного в MS SQL нет?
>> ЮЮ ©   (24.05.05 12:12) [12]
И это красиво??? Case-м было бы значительно красивей!!!!!
Что такое форматированно я знаю.


ЮЮ   (2005-05-24 12:12:00) [5]

Если за каскадом IF-ов не видишь кода, то:
1) учисть писать "красиво", т.е. форматированно
2) разбивай код на "подпрограммы"

PROCEDURE P1234(@param int) AS BEGIN
 IF @param = 1 BEGIN
   ...
 END
 ELSE
   P234(@param)  
END
PROCEDURE P234(@param int) AS BEGIN
 IF @param = 2 BEGIN
   ...
 END
 ELSE
   34(@param)  
END
PROCEDURE P34(@param int) AS BEGIN
 IF @param = 3 BEGIN
   ...
 END
 ELSE BEGIN
   ...
 END  
END

:)


evvcom   (2005-05-24 12:11:00) [6]

CASE в стандарте для этого не предназначен.


Ярослав   (2005-05-24 11:51:00) [7]

>> evvcom ©   (24.05.05 11:42) [9]
Внимательно читать все вопросы, в первом было написано Case как в Delphi.
Union здесь зачем, я хочу получить столбец из другой таблици а не объеденить две, т.е. данные первой то мне не нужны.
Еще раз повторяю - мне не нужно переписывать запрос в другом виде, мне нужно выполнять какие либо действия в зависимости от условия, т.е. в зависимости от уловия например выбрать данные, удалить, добавить, или вообще завершить работу процедуры, или триггера.


evvcom   (2005-05-24 11:42:00) [8]


> А где  when 3 then select aaa from bbb
>             where not ddd is null

См. [6].


> Кроме того это был только пример, после then мне не обязательно
> делать select, или select может быть из разных таблиц

Был пример, на пример и получил ответ. А для каждого отдельного случая соответственно и запрос переписывается в другом виде. Из другой таблицы? Так UNION есть для этого. В чем проблемы?


Ярослав   (2005-05-24 11:33:00) [9]

>> ЮЮ ©   (24.05.05 11:16) [7]
>>   SELECT
>>  CASE @aaaa
>>    WHEN 1 THEN aaa
>>    WHEN 2 THEN ddd
>>    WHEN 3 THEN aaa
>>  END as aaa
>> FROM bbb ..
А где  when 3 then select aaa from bbb
            where not ddd is null
Кроме того это был только пример, после then мне не обязательно делать select, или select может быть из разных таблиц, а вообще это какие либо совершенно не зависящие от друг друга (конечно зависящие от условия) действия


ЮЮ   (2005-05-24 11:16:00) [10]

>Мне надо
case @aaaa
 when 1 then select aaa from bbb
 when 2 then select ddd from bbb
 when 3 then select aaa from bbb
             where not ddd is null

На самом деле Select не туда положил. Тебе нужны не разные действияа возвращать разные поляв качестве одного поля результирующего набора данных
SELECT
 CASE @aaaa
   WHEN 1 THEN aaa
   WHEN 2 THEN ddd
   WHEN 3 THEN aaa
 END as aaa
FROM bbb ...


evvcom   (2005-05-24 11:11:00) [11]

select
 case @aaaa
   when 1 then aaa
   when 2 then ddd
   when 3 then aaa
 end
from bbb
where @aaaa <> 3 or not ddd is null


Ярослав   (2005-05-24 10:43:00) [12]

Все это я видел но:
SELECT Category=
  CASE type
      WHEN 'popular_comp' THEN 'Popular Computing'
      WHEN 'mod_cook' THEN 'Modern Cooking'
      WHEN 'business' THEN 'Businness'
      WHEN 'psyhology' THEN 'Psyhology'
      WHEN 'trad_cook' THEN 'Traditional Cooking'
      ELSE 'Not yet categorized'
   END,
   'Shortended Tiitle' = CONVERT(varchar(30), title),
   Price = price
FROM titles
WHERE price IS NOT NULL
ORDER BY type
COMPUTE AVG(price) BY TYPE
go

А мне не надо select aaa = case...
Мне надо
case @aaaa
  when 1 then select aaa from bbb
  when 2 then select ddd from bbb
  when 3 then select aaa from bbb
              where not ddd is null
к примеру, и еше со вложенностью, можно IF-ами но помоему это не совсем правильно


Max Zyuzin   (2005-05-24 10:18:00) [13]

>Ярослав   (24.05.05 09:47)  
Case есть... читай хелп
Syntax
Simple CASE function:

CASE input_expression
   WHEN when_expression THEN result_expression
       [ ...n ]
   [
       ELSE else_result_expression
   ]
END

Searched CASE function:

CASE
   WHEN Boolean_expression THEN result_expression
       [ ...n ]
   [
       ELSE else_result_expression
   ]
END


Polevi   (2005-05-24 10:05:00) [14]

а что, в BOL не написано ?


Ярослав   (2005-05-24 10:01:00) [15]

Про IF я знаю но у меня аргумент может принимать несколько значений, и каскад IF-ов получаеться, с case-м все было бы красиво, так надо понимать, что нет его в таком виле в MS SQL?


ЮЮ   (2005-05-24 09:55:00) [16]

IF ... BEGIN
 UPDATE ...

ELSE BEGIN
 INSERT ...
END
в ХP , UDF и триггерах, естестаенно


Наверх

Титульная страница Поиск, карта сайта Написать письмо