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

Откуда: Тернопіль, Україна
Сообщений: 2102
Доброго времени суток.

Имеется MSSQL 2008 R2

незамысловая хранимка, в зависимости от параметров мне нужно немного изменять выборку, подставляя условия в where
CREATE PROCEDURE dbo.GetPeople(@TypID INT, @id INT)
AS
BEGIN

  case @TypID
  when 0 THEN
      select 
      -- s.sname, t.sname, st.sname, r.sname, 
      p.*
      from people p, street s, town t, sovet st, region r
      where p.id_street=s.id
      and t.id=s.id_town
      and st.id=t.id_sovet
      and r.id=st.id_region;
      
  when 1 then
      select 
      -- s.sname, t.sname, st.sname, r.sname, 
      p.*
      from people p, street s, town t, sovet st, region r
      where p.id_street=s.id
      and t.id=s.id_town
      and st.id=t.id_sovet
      and r.id=st.id_region
      and r.id=@id; -- здесь отличые !!!

  when 2 then
      select 
      -- s.sname, t.sname, st.sname, r.sname, 
      p.*
      from people p, street s, town t, sovet st, region r
      where p.id_street=s.id
      and t.id=s.id_town
      and st.id=t.id_sovet
      and r.id=st.id_region
      and st.id=@id; -- и здесь !!!
            
  end;    
END


ругается на синтаксис case что не так, не могу понять, что ему не нравится? подскажите пожалуйста, с мастадем давно не работал, подскажите плиз.

Спасибо!
13 июн 12, 13:31    [12707330]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Alexandr Kr.
Member

Откуда: Украина, Харьков
Сообщений: 165
MMM_Corp,

Надо через IF конустркцию делать.
13 июн 12, 13:36    [12707387]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Не лень копипастить?

      select 
      -- s.sname, t.sname, st.sname, r.sname, 
      p.*
      from people p, street s, town t, sovet st, region r
      where p.id_street=s.id
      and t.id=s.id_town
      and st.id=t.id_sovet
      and r.id=st.id_region
      and (
        @TypID = 0
        or (@TypID = 1 and r.id = @id)
        or (@TypID = 2 and st.id = @id)
      )


Сообщение было отредактировано: 13 июн 12, 13:40
13 июн 12, 13:40    [12707414]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Гузы
Guest
MMM_Corp,
Хорошо бы
select
добавить...
Сразу же после
begin
13 июн 12, 13:49    [12707515]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Гузы
MMM_Corp,
Хорошо бы
select
добавить...
Сразу же после
begin
И чо будет?
13 июн 12, 13:52    [12707546]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Владимир СА
Member

Откуда:
Сообщений: 7915
Просто топикастеру надо почитать как использовать CASE...
Выражение CASE (Transact-SQL).
13 июн 12, 13:56    [12707589]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
MMM_Corp
Member

Откуда: Тернопіль, Україна
Сообщений: 2102
Большое спасибо все получилось!

П.С. Извиняюсь за глупый вопрос, просто призабыл, хелп конечно читал.
13 июн 12, 14:18    [12707763]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Case + stored proc  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69095
Похожая проблема. MSDN почитал и попробовал реализовать данную конструкцию в условии where:
w.code in ( case w.Code when @code =( -1) then w.Code=@code else w.Code= w.Code end) 

Но Ms SQL ругается на синтаксис(не нравятся ему знаки после @Code). Подскажите, где исправить? Заранее благодарен

MS SQL server 2000.
24 июн 13, 13:21    [14473740]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Прогер_самоучка,

CASE - это функция, возвращающая ОДНО ЗНАЧЕНИЕ одного из допустимых типов.
Булевого типа в MSSQL пока нет.
CASE имеет две формы. Смешивать их нельзя.

Использование конструкции IN() в данном контексте просто удивительно...
Условие можно написать и без CASE в данном случае
24 июн 13, 13:25    [14473776]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Прогер_самоучка,

w.code = case @code = -1 then -1 else w.code end
24 июн 13, 13:33    [14473850]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
Прогер_самоучка
Похожая проблема. MSDN почитал и попробовал реализовать данную конструкцию в условии where:
w.code in ( case w.Code when @code =( -1) then w.Code=@code else w.Code= w.Code end) 


Но Ms SQL ругается на синтаксис(не нравятся ему знаки после @Code). Подскажите, где исправить? Заранее благодарен

MS SQL server 2000.
Естественно ругается.
Представьте, что будет после вычисления и раскрытия CASE:
w.code in (w.Code=@code) 

Что это означает? Сервер в недоумении.

case w.Code when @code =( -1) 
- тоже странная конструкция, я даже предположить не могу, что это значит.

Нужно написать, например:
w.code in ( case when @code =( -1) then @code else w.Code end) 
24 июн 13, 13:37    [14473885]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
ROLpogo
w.code = case @code = -1 then -1 else w.code end
Не угадали, будет синтаксическая ошибка :-)
24 июн 13, 13:38    [14473891]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
@code=-1 and w.Code=-1 or @code<>-1 or @code is null
Так что ли?
Зачем CASE-то вообще?
24 июн 13, 13:44    [14473930]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69095
Всем большое спасибо за объяснения.
alexeyvg, вам в особенности. С учётом вашего образца получилось следующее:
w.code in (  case when @code <>( -1) then @code else w.Code end)
24 июн 13, 13:52    [14473989]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Прогер_самоучка
Всем большое спасибо за объяснения.
alexeyvg, вам в особенности. С учётом вашего образца получилось следующее:
w.code in (  case when @code <>( -1) then @code else w.Code end)
w.code может быть IS NULL?
Зачем IN, если CASE возвращает ОДНО значение (см. выше)?
24 июн 13, 13:54    [14474000]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
alexeyvg
ROLpogo
w.code = case @code = -1 then -1 else w.code end
Не угадали, будет синтаксическая ошибка :-)


Странно. Какая должна быть ошибка? У меня ошибки нет.
24 июн 13, 13:59    [14474029]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
ROLpogo
alexeyvg
пропущено...
Не угадали, будет синтаксическая ошибка :-)


Странно. Какая должна быть ошибка? У меня ошибки нет.
А где там WHEN? Покажите
24 июн 13, 14:01    [14474036]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 69095
iap
Зачем IN, если CASE возвращает ОДНО значение (см. выше)?
Сначала там было просто знак "=". IN потом появилось. Есть принципиальная разница или так не положено писать?
автор
w.code может быть IS NULL?

Нет.
24 июн 13, 14:01    [14474037]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
iap
ROLpogo
пропущено...
Странно. Какая должна быть ошибка? У меня ошибки нет.
А где там WHEN? Покажите


Точно! Обман зрения. (рукалицо)
24 июн 13, 14:29    [14474222]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
ROLpogo
Странно. Какая должна быть ошибка? У меня ошибки нет.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '='.
24 июн 13, 14:38    [14474299]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32169
ROLpogo
Точно! Обман зрения. (рукалицо)
Ну да, WHEN забыли
24 июн 13, 14:40    [14474316]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
мне больше другая конструкция нравится:
where w.code = isnull(nullif(@code,-1),w.Code)
24 июн 13, 15:24    [14474638]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
Cygapb-007
мне больше другая конструкция нравится:
where w.code = isnull(nullif(@code,-1),w.Code)
Тогда уж
where w.code between isnull(nullif(@code,-1),-2147483648) and isnull(nullif(@code,-1),2147483647)
Чтобы не было функции от w.code
24 июн 13, 15:31    [14474722]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
iap
Member

Откуда: Москва
Сообщений: 47195
iap
Cygapb-007
мне больше другая конструкция нравится:
where w.code = isnull(nullif(@code,-1),w.Code)

Тогда уж
where w.code between isnull(nullif(@code,-1),-2147483648) and isnull(nullif(@code,-1),2147483647)

Чтобы не было функции от w.code
Стоп!
Это же неправильно!
При -1 поле должно равняться -1, а остальные значения параметра игнорироваться.
Разве не так?
24 июн 13, 15:33    [14474743]     Ответить | Цитировать Сообщить модератору
 Re: Case + stored proc  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
я понял так, что при @code=-1 выбираются все строки, а при (например) @code=21 выбираются те где w.code=21
кстати, case тоже функция от w.code
24 июн 13, 15:50    [14474894]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить