2014-02-11 5 views
3

Как и в случае с названием, которое я уже объяснял, я борюсь с моим предложением WHERE в моей хранимой процедуре SQL.SQL Server: Where clause внутри IF .. ELSE

Я получил запрос SELECT, который хорошо соединяется с несколькими таблицами и в конце, если получил предложение WHERE, которое дает конкретные значения для поиска.

Моя проблема заключается в том, что я хочу, чтобы расширить эту хранимую процедуру для 2-х различных WHERE статей, но я не могу получить мой IF ELSE правильно разобрать запрос ..

Например:

SELECT ....... 
FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE 
    man.Klant_ID = @Klant 
    AND (@ManID = 0 OR man.ID = @ManID) 
    AND .... (which continues like the rule above) 

Здесь я хочу, чтобы получить что-то вроде этого:

SELECT ....... 
FROM TABLE_X 
INNER JOIN TABLE_Y..... 

IF @TEMPVAR = '' 
    WHERE [email protected] 
    AND (@ManID = 0 OR man.ID = @ManID) 
    AND... 
ELSE 
    WHERE TABLE_X.ID IN (@TEMPVAR) 

@tempvar должны содержать разделенные запятыми идентификаторы, как 10001,10002,10003)

Я борюсь с синтаксисом и искал какое-то время, но не могу найти правильное решение.

Заранее благодарен!

+1

это может помочь http://stackoverflow.com/questions/10191424/case-in-where-sql-server – markg

+0

Довольно просто .... вы не можете это сделать ... Вам нужно поставить все предложение select в ваш IF ELSE .. – logixologist

+0

При написании SQL, не думайте о структурах управления 'IF/ELSE' как механизмы для _build_ SQL заявления. Вместо этого любая логика, связанная с результатами, возвращаемыми запросом, должна быть встроена в его предложение WHERE, и переменные могут использоваться там, как они могут, в рамках функции или хранимой процедуры. –

ответ

4

Вы можете сделать это с СЛУЧАЙ:

SELECT ....... FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE TABLE_X.FIRSTCOLUMN = 
    CASE WHEN @TEMPVAR = '' THEN 123 
     ELSE 456 
    END 

или непосредственно в пункте WHERE с OR:

WHERE (@TEMPVAR = '' 
     AND [email protected] 
     AND (@ManID = 0 OR man.ID = @ManID) 
     AND... 
    ) 
     OR 
     (@TEMPVAR <> '' 
     AND TABLE_X.ID IN (@TEMPVAR) 
    ) 
+0

Это действительно правильные решения проблемы. Но я вроде как объяснил свой вопрос не так. Я обновил свой вопрос. Но я ценю усилия! – Yosoyke

+0

OK Одинаковое понятие, но с OR. См. Редактирование. –

+0

Это действительно отличает предложения так, как я хочу, поэтому я собираюсь принять ваш ответ! Дополнительный вопрос: @Tempvar Я хотел бы содержать запятые идентификаторы для использования, например: .. где ID IN (@TEMPVAR) (было бы ГДЕ ID IN (10001,10002,10003)) .. Как я могу сделать это возможным?Теперь я объявил, что TempVar является «nvarchar (max)», потому что он содержит запятые .. – Yosoyke

2

Вы можете сделать это с помощью непосредственно логики в where:

SELECT ....... FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE TABLE_X.FIRSTCOLUMN = 123 and @TEMPVAR = '' or 
     TABLE_X.FIRSTCOLUMN = 456 and @TEMPVAR <> '' 

Если TEMPVAR может быть NULL, то:

SELECT ....... FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE TABLE_X.FIRSTCOLUMN = 123 and @TEMPVAR = '' or 
     TABLE_X.FIRSTCOLUMN = 456 and (@TEMPVAR <> '' or @TEMPVAR is null) 
0

Другой способ сделать это:

IF @TEMPVAR = '' 
SELECT ....... FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE TABLE_X.FIRSTCOLUMN = 123 
    AND .... 
ELSE 
SELECT ....... FROM TABLE_X 
INNER JOIN TABLE_Y..... 
WHERE TABLE_X.FIRSTCOLUMN = 456 
    AND .... 
Смежные вопросы