2016-02-06 3 views
1

У меня есть таблица в результате внешнего соединения, я хочу, чтобы SUM по атрибуту, но некоторые кортежи имеют NULL в этом атрибуте. Как можно было бы конвертировать NULL в соответствующее значение (в данном случае 0)?Преобразование NULL в реляционной алгебре

Книга, которую я читаю, на самом деле не слишком много говорит о типе NULL в реляционной алгебре, поэтому я собираюсь предположить, что агрегированные функции не пытаются сделать «правильную вещь» и интерпретировать нуль как единица.

+0

В какой книге? «Расширенная реляционная алгебра» не является стандартной. – philipxy

ответ

0

Хорошо, я решил. Хитрость заключается в использовании расширенного оператора проекции наряду с выбором и объединением.

В моем конкретном случае мы хотели превратить аннулирует в 0s, здесь мы идем:

Пусть отношение R

R - выберите (Q = нуль, R) объединение проекта (рп, 0 -> д , выберите (q = null, R))

На LHS союза удалим все вхождения q = null из R. На RHS мы берем все кортежи, где q = null, и проектируем их как pn и все Значения q-столбцов равны 0.

Объединение в семантике сумки может считаться плюсом.

+0

Вы правы, но тогда лучше использовать 'q is null' вместо' q = null', поскольку последнее условие всегда ложно. И если вы используете расширенную проекцию (см., Например, [this] (http://infolab.stanford.edu/~ullman/fcdb/aut07/slides/ra.pdf)), тогда вы можете сделать это только с одной проекцией, предполагая, что у вас есть случайный оператор. – Renzo

+0

Это правда, что в SQL вы не можете выполнить проверку равенства с нулевым значением, как я делал выше, но в ERA ничего не делает неправильным. К сожалению, нет случайного оператора! – ejbs

+0

Но используете ли вы какую-то конкретную систему с ERA в качестве языка? – Renzo

1

В реляционной модели данных значение NULL не является обычным значением и не преобразуется в какое-либо конкретное значение в соответствии с различными операторами.

СУММА, как и другие совокупности операторов, игнорировать NULL значения, так что на самом деле суммирования столбец с нулевыми значениями эквивалентна сумме всех ненулевое значение, и это, obiously, что эквивалентно, как лечить NULL0. Точно так же, если вы попытаетесь вычислить среднее числовое число, будут суммированы только значения, отличные от нуля, и чем общее количество будет делено на число ненулевых значений (не все значения).

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

Например, следующими SQL-запрос вычисляет AVG ненулевых значений column:

SELECT AVG(column) 
FROM table 

в то время как следующий вычисляет AVG с учетом NULL значения, как 0 (и так дает результат, который отличается от предыдущего):

SELECT AVG(CASE WHEN column IS NULL THEN 0 ELSE column END) 
FROM table 
+2

Это было бы совершенно правильно в SQL, но я говорю о расширенной реляционной алгебре, отсюда и моя путаница. Благодарю за ваш ответ! – ejbs

+0

Реляционная алгебра изучается в основном, чтобы дать семантику реляционной модели данных и показать, как выражения SQL могут быть преобразованы для оптимизации. В расширенной версии, в частности, есть такие операторы, как скопления, не присутствующие в оригинальной, более детально моделировать семантику SQL, так что, например, она работает на пакетах вместо наборов. И почти всегда это обсуждается в книгах без ссылки на значения NULL. Итак, на самом деле, я думаю, что вопрос более подходит для SQL тогда для реляционной алгебры. – Renzo

+0

Я предлагаю вам повторно отправить вопрос для SQL вместо реляционной алгебры и разместить свой ответ там. – ejbs

0

Вы можете использовать функцию IFNULL() MySql в:

SELECT 
    AVG(IFNULL(possibleNullValue, 0)) 
FROM 
    table 

IFNULL() будет проверять, если выражение 1 равно нулю, и, если да, то значение, которое предоставляется в качестве второго выражения - в этом случае 0.

Если вы не используете MySQL, см equvivalents для других двигателей DB here