Как обрабатывается null с использованием union и union all в mysql? - PullRequest
0 голосов
/ 28 декабря 2018

на основе приведенного ниже оператора

select null
union
select null

выход этого оператора:

null

В то время как этот оператор:

select null
union all
select null

Выходы:

null
null

Как null <> null, то как здесь обрабатывается значение null и в каком типе данных оно считается

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

В стандартном SQL UNION удаляет повторяющиеся записи, UNION ALL - нет.К счастью, ваша СУБД достаточно умна, чтобы понять, что NULL IS NULL, и удаляет дубликаты строк, когда используется UNION.

Примечание: null = null равно unknown, однако null <> null равно unknown какЧто ж.Единственный способ проверить недействительность - использовать что-то вроде IS NULL.

SELECT case when null <> null then 1 else 0 end;  --> yields : 0
SELECT case when null =  null then 1 else 0 end;  --> yields : 0
SELECT case when null IS null then 1 else 0 end;  --> yields : 1
0 голосов
/ 28 декабря 2018

UNION является оператором множества и включает проверку на наличие «повторяющихся строк».Спецификации определяют повторяющиеся строки как «не отличимые» и отличающиеся как:

Два значения называются не отличимыми, если либо: оба являются нулевым значением , либо онисравнить в соответствии с подпунктом 8.2 "". В противном случае они различаются. Две строки (или частичные строки) различаются, если хотя бы одна из их пар соответствующих значений различна. В противном случае они не различаются. Результатом оценки того, различаются ли два значения или две строки, являетсяникогда неизвестно.

(выделено мной). Итак, в этом примере:

select null
union all
select null

две строки считаются дублирующими друг друга, поскольку нулевые значения в первом столбце рассматриваютсяне отличается ... то есть то же самое. И по определению UNION возвращает только одну строку из набора повторяющихся строк.

0 голосов
/ 28 декабря 2018

Я полагаю, что вы знаете разницу между UNION (дедуплицирует результаты) и UNION ALL

select 'x' from dual where null is null \\results with x 

В этом случае значение null фактически равно нулю.Что означает, что union возвращает правильный результат (дедуплицированный)

...