2015-09-22 3 views
2

Когда у меня есть оператор условного выражения в моем заявлении WHERE, то NULL s автоматически не включены?Операторы NULLS в WHERE - SQL

Например, в запросе с GROUP BY утверждением, что имеет линию FROM @data WHERE Trade_Amt > 0 AND Execution_Code != 'EXPIRATION', Execution_Code значения, которые null не будут включены в сумму.

Если я включаю OR Execution_Code IS NULL, тогда я получаю больше записей, чем ожидалось.

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

Пример:

Таблица @data

Trade_Amt  Execution_Code Trade_Px 
----------------------------------------- 
4     XVD    5 
-4     NULL   5 
4     NULL   5 
5     EXPIRATION  5 

Запрос:

SELECT 
    SUM(Trade_Amt) AS [Trade_Amt], 
    dbo.ConcatStr(DISTINCT Execution_Code , ',', 'ASC') AS [Execution_Code], 
    Trade_Px 
    --above line concatenates execution code strings together during summation 
FROM 
    @data 
WHERE 
    Trade_Amt > 0 AND Execution_Code != 'EXPIRATION' 
GROUP BY 
    Trade_Px 

Ожидаемый результат:

Trade_Amt  Execution_Code  Trade_Px 
-------------------------------------------- 
    8     XVD    5 

То, что я на самом деле получить:

Trade_Amt  Execution_Code  Trade_Px 
-------------------------------------------- 
    4     XVD    5 
+0

Зачем отвечать _0_? поскольку предложение where включает в себя только 'trade_amt> 0'? –

+0

Также включите запрос с 'null, который не работает для вас. –

+0

Его суммирование по Trade_Amt. – pavbagel

ответ

1

Вы можете использовать (), чтобы указать, что вы хотите, только коды выполнения, которые не равны истечения и нулевые

WHERE Trade_Amt > 0 AND (Execution_Code != 'EXPIRATION' OR Execution_Code IS NULL) 

Если вы не имеете (), вы не получите результаты вы ожидаете.

+0

Я пробовал это, и у меня было больше записей, чем ожидалось. Имейте в виду, что приведенный выше пример - всего лишь фрагмент гораздо большего набора данных. – pavbagel

+0

Используете ли вы круглые скобки? – tcigrand

+0

Ницца, это сработало. Раньше я не указывал круглые скобки. Спасибо!! Но я до сих пор не понимаю, почему я должен включить null. – pavbagel

0

NULL - это другое значение. Он не может быть проверен как больше или меньше. Потому что это не так. Это NULL. Таким образом, единственный способ проверить, является ли значение NULL является:

Select thisvalue from thistable where value is NULL 

или

Select thisvalue from thistable where value is not NULL 

Таким образом, вы должны разделить эти виды вещей, в тех случаях, когда значение действительно может быть NULL.

0

null не является ценностью - это его отсутствие. Для любого оператора, который обрабатывает значения (такие как =, !=, >, <, like и т. Д.), Он возвращает «неизвестный» результат. Так как «неизвестный» не является «истинным», такие условия будут исключать null значения, если не обрабатывать их явно с помощью is оператора:

SELECT SUM(Trade_Amt), 
     dbo.ConcatStr(DISTINCT Execution_Code , ',', 'ASC') AS [Execution_Code], 
     Trade_Px 
FROM  @data 
WHERE (Trade_Amt IS NULL OR Trade_Amt > 0) AND 
     (Execution_Code IS NULL OR Execution_Code != 'EXPIRATION') 
GROUP BY Trade_Px 
0

Как уже отмечалось, вы можете использовать круглые скобки, чтобы убедиться, что is null является частью ваш execution_criteria. Вы можете также использовать функцию ISNULL, например, так:

WHERE Trade_Amt > 0 AND ISNULL(Execution_Code, 'X') != 'EXPIRATION' 

Где 'X' может быть что угодно, до тех пор, как он не является «Истечение.«В случае, если ваш Execution_Code равен NULL, он вместо этого проверяет, что« X »не равен« Истечение срока действия », что, конечно же, не будет.

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