2015-02-16 5 views
0

Я не могу проверить, если null = null, так как у меня нет разрешений для создания данных в базе данных, которую я использую.В Oracle SQL имеет значение null = null?

Мой вопрос:

Если у меня есть таблица с двумя строками:

Row 1: ItemID = 1, CollectionID = 1, Price = null 
Row 2: ItemID = 2, CollectionID = 1, Price = null 

И мой запрос выглядит следующим образом:

SELECT CollectionID 
    FROM my_table TB 
WHERE Price >= (SELECT avg(Price) 
        FROM my_table 
        WHERE TB.CollectionID = CollectionID); 

Будет collectionID 1 отображаться в результатах? Другими словами, у нас есть null значения для TB.CollectionID и для CollectionID.

TB.CollectionID = CollectionID?

ответ

9

Нет, NULL равно никакой другой ценности, в том числе другой экземпляр NULL (это верно для SQL в целом, а не только Oracle (а)).

Это потому, что NULL является не значение, скорее это сущность, означающая «неизвестно», «недоступно» или «неприменимо».

Вот почему, если вы хотите проверить, если что-то NULL, вы используете:

where something is null 

вместо:

where something = null 

Если вы сделать хотите рассматривать NULL значения равными, вы можете сделать что-то вроде:

where TB.CollectionID = CollectionID 
    or (TB.CollectionID is null and CollectionID is null) 

, но этот вид идет против целого концепции трехзначной логики SQL.

И, как в стороне, не позволяйте недостаток власти на ваших собственных систем ограничить то, что вы можете сделать. См., Например, SqlFiddle, что позволяет создавать и управлять базами данных по своему усмотрению.


(а) Хотя, конечно, некоторая СУБД не всегда следовать стандартных способами, которые имеют смысл, например, определенный крупный поставщик (без имен, но она начинается с o и заканчивается racle(б)) не в состоянии хранить строку нулевой длины в поле VARCHAR типа, а не принуждать его быть NULL :-)

(б) Или, возможно, в этом случае имеет смысл сказать, что начинается с NULL и заканчивается oracle :-)

+0

@ Louis-Philippe Baillargeon Обратите внимание, что это правило SQL. Это не относится к Oracle. – EJP

+0

Стоит отметить, что функция 'DECODE' является исключением из этого правила, и она _does_ рассматривает два' NULL 'как равные. –

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