在Access-SQL中将NULL值设置为自定义值

时间:2011-08-01 14:47:15

标签: sql ms-access join left-join ms-access-2003

当LEFT JOIN两个表时,有没有办法将无法匹配的单元格(NULL)设置为自定义值?所以例如当结果返回时,NULL单元实际上具有一个值,例如, “N / A”或“未找到”?

我想在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 个答案:

答案 0 :(得分:2)

您可以使用Nz()替换NULL;

的任意值
SELECT Nz(F, "Not Present") FROM T

如果F"Not Present",则会返回字段F的值或NULL

答案 1 :(得分:1)

请记住,SQL的外连接是一种显式设计用于投影空值的关系联合。你想避免使用null值(在我看来也是一件好事),因此你应该避免使用外连接。请注意,现代关系语言完全没有使用null和outer join的概念(参见尾注)。

此外部联接:

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没有semijoin运算符,如果您的产品未实现标准SQL的SELECT语法,则需要您在JOIN子句中指定列列表并编写NATURAL JOIN子句(Access hasn' t),这导致很多代码表达一些非常简单的东西。

因此,您可以编写代码,例如上面的第二个查询,但使用实际的默认值而不是空值。


镇上唯一的关系游戏是由Chris Date和Hugh Darwen称为“第三宣言”的D语言规范。它明确地拒绝了Codd的null(后来Codd提出了两种null)不适应外连接运算符(在最近的着作中,作者提出了关系值属性作为外连接的替代)。具体引用:

℃。 J. Date(2009):SQL和关系理论:如何编写准确的SQL代码:第4章,“关于外连接的评论”(第84页)

Darwen,Hugh(2003):列名的重要性:“请注意,在教程D中,唯一的'join'运算符称为JOIN,它意味着'自然连接'。” (第16页)

℃。 J. Date和Hugh Darwen(2006):数据库,类型和关系模型:第三个宣言:删除4:“D不包括'关系'的概念,其中某些'元组'包含一些不具有'属性'的'属性'有价值。“