Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Case в MS SQL   Найти похожие ветки 

 
Ярослав   (2005-05-24 09:47) [0]

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


 
ЮЮ ©   (2005-05-24 09:55) [1]

IF ... BEGIN
 UPDATE ...

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


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

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


 
Polevi ©   (2005-05-24 10:05) [3]

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


 
Max Zyuzin ©   (2005-05-24 10:18) [4]

>Ярослав   (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



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

Все это я видел но:
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-ами но помоему это не совсем правильно


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

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 11:16) [7]

>Мне надо
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 ...


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

>> ЮЮ ©   (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 может быть из разных таблиц, а вообще это какие либо совершенно не зависящие от друг друга (конечно зависящие от условия) действия


 
evvcom ©   (2005-05-24 11:42) [9]


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

См. [6].


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

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


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

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


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

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


 
ЮЮ ©   (2005-05-24 12:12) [12]

Если за каскадом 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

:)


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

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


 
evvcom ©   (2005-05-24 15:29) [14]


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

IF ... ELSE ...

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


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

>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:46) [16]


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.057 c
11-1102605753
stranger_2004
2004-12-09 18:22
2005.07.11
Наследование в МСК


3-1117625052
Bagdat
2005-06-01 15:24
2005.07.11
Можно ли поток класса TStream сразу преоброзовать в Excel файл?


6-1112446444
CppDemon
2005-04-02 16:54
2005.07.11
IP -> FQDN


3-1117530037
Term
2005-05-31 13:00
2005.07.11
Вставка большого количества записей


3-1117002821
yk
2005-05-25 10:33
2005.07.11
отображение FLOAT