Использование ISNULL с полями базы данных NULL - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь сделать что-то, что должно быть довольно простым, но ISNULL не делает то, что, как я думал, будет.

В основном у меня есть хранимая процедура, и я ожидаю, что либо PARAM1, либо PARAM2 будут иметь совпадающее значение в моей таблице.

SELECT * FROM MyTable WITH (NOLOCK)
        WHERE      
        field1 = ISNULL(@PARAM1 ,field1 )
        AND        
        field2 = @PARAM2

Это работает нормально, пока в моей строке не появятся поля NULL, тогда эти результаты исключаются. Есть ли другой метод, который может удовлетворить это?

Ответы [ 3 ]

2 голосов
/ 12 мая 2011

ISNULL заменяет первое значение вторым значением, поэтому только если ваш параметр @ PARAM1 равен NULL, он заменяет его на PARAM1. Я предполагаю, что вы не передаете значения NULL, так что это, вероятно, не то, что вы хотите. Скорее всего, вы просто хотите сказать

WHERE
(Field1 = @PARAM1 OR Field1 IS NULL)
AND
Field2 = @Param2

Полагаю, вы также можете использовать ISNULL таким образом:

ISNULL(Field1, @PARAM1) = @PARAM1
1 голос
/ 12 мая 2011

ноль является особенным в sql. Если вы выполняете какие-либо сравнения для столбца, все строки, для которых этот столбец имеет нулевое значение, будут исключены.

SELECT * FROM MyTable WITH (NOLOCK)
        WHERE      
        (PARAM1 = @PARAM1 or PARAM1 is null)
        AND        
        (PARAM2 = @PARAM2 or PARAM2 is null)
1 голос
/ 12 мая 2011

Используйте

field1 = ISNULL(@PARAM1, A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL)

Это оценит-

field1 = @ PARAM1, если @ PARAM1 НЕДЕЙСТВИТЕЛЕН.

field1 = A_REPLACEMENT_VALUE_IF_PARAM1_IS_NULL, если @ PARAM1 IS NULL

EDIT:

Попробуйте это:

--If you want to ignore the WHERE clause if PARAM1/2 is null
ISNULL(field1, DEFAULT_VALUE) = ISNULL(@PARAM1, ISNULL(field1, DEFAULT_VALUE))
OR
ISNULL(field2, DEFAULT_VALUE) = ISNULL(@PARAM2, ISNULL(field2, DEFAULT_VALUE))

OR

--To get all rows with field1/2 as PARAM1/2 and ignore everything else
field1 = @PARAM1 OR field2 = @PARAM2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...