2015-01-29 5 views
-1

Моя хранимая процедура принимает необязательный параметр, как это:Использование NULL в WHERE

CREATE PROCEDURE MyProc 
(  
    @P1 varchar(255) = NULL 
) 
AS 
    SELECT * FROM MyTable WHERE MyField = @P1 

@P1 Когда это NULL, я хочу, чтобы выбрать все записи. Один очевидный способ - использовать здесь IF, но я хотел бы сделать это в одном выражении SQL. Может ли кто-нибудь предложить умный способ достичь этого? Я думаю о линиях использования ISNULL() или MyField = MyField. Попробовали несколько способов, но тот факт, что NULL = NULL не является True, является главной блокадой здесь.

+0

Вы должны взглянуть на эту статью об этом типе запроса. http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

ответ

4

Один из способов:

SELECT * FROM MyTable WHERE @P1 IS NULL OR MyField = @P1 

Другой, возможно, более эффективный подход с использованием If...Else:

if(@P1 IS NULL) 
     begin 
      SELECT * FROM MyTable 
     End 
Else 
     begin 
      SELECT * FROM MyTable WHERE MyField = @P1 
     End 
+0

mmm ... не произойдет, если значение '@ P1' имеет значение? – dotNET

+1

@dotNET: если '@ P1' имеет значение' @ P1 IS NULL', возвращается 'false', а' MyField = @ P1' будет проверяться для каждой строки. В противном случае все строки возвращаются, поскольку '@ P1 IS NULL' уже возвращает' true'. –

+1

@dotNET - Вы выполнили запрос по крайней мере. Узнайте, как работает оператор «OR». Btw - это первый из них для Upvote –

0

WHERE MyField = ISNULL(@P1, MyField)

Это должно получить то, что вам нужно.

+1

Это было очевидно, но оно терпит неудачу из-за того, что 'NULL = NULL' не является True в SQL, как указано в вопросе. – dotNET

+2

@dotNET, который не будет терпеть неудачу. В этом коде отсутствует сравнение NULL = NULL. –

+0

@SeanLange: Что, если 'MyField' равно NULL в определенной строке, а' @ P1' тоже NULL? – dotNET

0

Других ответов дал вам прямые решения, но есть то, что вам нужно работать с нулем:

Вы не можете использовать равенство (=) и неравенство (<>) операторов с NULL, потому что SQL обрабатывает NULL как отдельные ценность, которая никогда не равна чему-либо (даже сама по себе - null = null - это ложь!).

Скорее используйте value is null и value is not null для проверки нулевого или не нулевого значения соответственно.

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