Установка значений NULL в пользовательское значение в Access-SQL - PullRequest
2 голосов
/ 01 августа 2011

При левом соединении двух таблиц есть ли способ установить ячейки, которые не могут быть сопоставлены (NULL), к пользовательскому значению?Например, когда возвращается результат, NULL-ячейки действительно имеют значение, например, «N / A» или «Not found»?

Я хочу сделать это в MS Access 2003


Пример:

| id | value |               | id | other value |
|----|-------|   LEFT JOIN   |----|-------------|
| 1  | hello |   -- id -->   | 2  | world       |
| 2  | you   |

results in:

| id | value | other value |
| 1  | hello | NULL        |
| 2  | you   | world       |

but should be:

| id | value | other value |
| 1  | hello | custom-val  |
| 2  | you   | world       |

Ответы [ 2 ]

2 голосов
/ 01 августа 2011

Вы можете использовать Nz() для замены произвольного значения на NULL;

SELECT Nz(F, "Not Present") FROM T

Возвращает либо значение поля F, либо "Not Present", если F были NULL.

1 голос
/ 12 августа 2011

Имейте в виду, что внешнее объединение SQL является своего рода реляционным объединением, которое явно предназначено для проецирования нулевых значений. Вы хотите избежать использования нулевого значения (на мой взгляд, это тоже хорошо), поэтому вам следует избегать использования внешних объединений. Обратите внимание, что современные реляционные языки полностью обходятся без концепции нулевого и внешнего соединения (см. Сноску).

Это внешнее соединение:

SELECT DISTINCT T1.id, T1.value, T2.other_value
  FROM T1
       LEFT OUTER JOIN T2
          ON T1.id = T2.id;

… семантически эквивалентен этому коду SQL:

SELECT T1.id, T1.value, T2.other_value
  FROM T1
       INNER JOIN T2
          ON T1.id = T2.id
UNION
SELECT T1.id, T1.value, NULL
  FROM T1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM T2
                    WHERE T1.id = T2.id
                  );

Второй запрос может показаться сложным, но это только из-за того, как SQL был разработан / развит. Вышесказанное - это просто естественное соединение, союз и полусоединение. Однако в SQL нет оператора полусоединения, требуется указать списки столбцов в предложении SELECT и написать предложения JOIN, если в вашем продукте не реализован синтаксис NATURAL JOIN стандартного SQL (в Access нет), что приводит к много кода, чтобы выразить что-то довольно простое.

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


Единственная реляционная игра в городе - это спецификация языка D, известного под названием «Третий манифест» Криса Дейта и Хью Дарвена. Он явно отвергает нулевые значения Кодда (позднее Кодд предлагал два типа нулевых значений) не поддерживает внешний оператор соединения (в более поздних работах авторы предлагали атрибуты со значением отношения как альтернативу внешнему объединению). Конкретные цитаты:

C. J. Дата (2009): SQL и реляционная теория: как написать точный код SQL: глава 4, «Замечание о внешнем соединении» (стр.84)

Darwen, Hugh (2003): Важность имен столбцов: «Обратите внимание, что в Tutorial D единственный оператор« join »называется JOIN, и это означает« естественное объединение »». (С.16) * * тысячу двадцать-один

C. J. Date and Hugh Darwen (2006): Базы данных, типы и реляционная модель: Третий манифест: Запрет 4: «D не должно включать в себя понятие« отношения », в котором некоторый« кортеж »включает в себя некоторый« атрибут », который не имеют значение. "

...