2010-11-11 5 views
1

Пытается настроить хранимую процедуру SQL, которая, если переданная ему переменная равна ключевому слову «Все», отменяет столбец «Имя платформы» из предложения WHERE и возвращает все в PlatformName и переменной в @Title ,SQL WHERE Предложение с CASE

Мой код SQL ниже.

WHERE PlatformName = CASE @Platform 
         WHEN 'All' THEN '' 
         ELSE @Platform 
        END 
AND Title LIKE '%' + @Title + '%' 

'' ничего не возвращает.

 
Table 
PlatformName Title 
XBox 360  Foobar 
PS3   Foobar 
+0

Это не полный вопрос. Является платформой либо «Все», либо я предполагаю «XBOX», «Playstation» и т. Д.? Сделайте простой выбор, чтобы определить, что возвращается, когда PlatformName = '' и Title LIKE '%' + @Title + '%'. Скажи мне, что получишь. –

+0

См. Вопрос еще раз. Извините за путаницу. Он был отредактирован. – KennyH

ответ

4

Один из способов сделать именно то, что вы пытаетесь сделать, это:

WHERE PlatformName = CASE @Platform 
         WHEN 'All' THEN PlatformName 
         ELSE @Platform 
        END 
AND Title LIKE '%' + @Title + '%' 

Другой распространенный способ, которым Вы будете видеть используется:

WHERE (PlatformName = @Platform OR @Platform = 'All') 
    AND ... 

Я бы рекомендовал тестирование тех, для производительности.

+0

Отлично работает. Благодаря! – KennyH

0

Просто сделать что-то вроде этого:

WHERE ((PlatformName = @Platform) OR (@Platform = 'All')) 

Примечание: если вы делаете объединение в запросе вы можете увидеть выигрыш в производительности, если вы добавите это объединение. Например,

SELECT * 
FROM Games G 
JOIN Platform P ON G.pID = P.pID AND ((PlatformName = @Platform) OR (@Platform = 'All')) 

Таким образом, сканирование таблицы платформы сокращается, и запрос будет быстрее.

+0

Странно, чтобы получить голосу за этот правильный ответ, комментарий будет приятным. – Hogan

+0

Я сам не голосовал, но я сомневаюсь в вашей претензии «вы можете увидеть большую производительность». – onedaywhen

+0

@onedaywhen: fair point - в этом случае он зависит от размера таблицы целевой таблицы (например, платформы). Я видел, что это изменение уменьшает запрос от секунд до миллисекунды, но это зависит от соответствующих таблиц. Я удалил «большой», как кивок, но не всегда. – Hogan

-1

Синтаксис правильно, я попробовал его на моей базе данных SQL Server, и она работала со следующим запросом:

SELECT * FROM CNT 
WHERE CP_NOM = CASE CP_COD WHEN 2824 THEN 'NOMBRE' END AND CP_COD > 10 

Может быть, ошибка приходит с значениями переменных @Platform ИЛИ @title.

В любом случае, вы можете заменить значение ваших пустых полей платформы (PlatformName = «») с «All», вы можете сделать более простой запрос,

WHERE PlatformName = @Platform AND Title LIKE '%' + @Title + '%' 
+0

Это неправильно. Он не хочет, чтобы All соответствовал только пустым полям, которые он хочет, чтобы они соответствовали каждой записи. – Hogan

+0

Вот что делает его запрос. Теперь с отредактированным вопросом я понимаю, чего он хочет. Однако я объяснил, как использовать CASE внутри WHERE, то есть заголовок квестона. – greuze

Смежные вопросы