【问题标题】:Setting NULL values to a custom value in Access-SQL在 Access-SQL 中将 NULL 值设置为自定义值
【发布时间】:2011-10-17 12:40:14
【问题描述】:

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

我想在 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       |

【问题讨论】:

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


    【解决方案1】:

    您可以使用Nz() 将任意值替换为NULL

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

    如果FNULL,则返回字段F"Not Present" 的值。

    【讨论】:

      【解决方案2】:

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

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


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

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

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

      C. J. Date 和 Hugh Darwen(2006 年):数据库、类型和关系模型:第三个宣言:Proscription 4:“D 不应包含‘关系’的概念,其中一些‘元组’包含一些不包含的‘属性’有一个价值。”

      【讨论】:

      • 引用“现代关系语言已经完全摒弃了空连接和外连接的概念”,好吗?
      • 第二个查询使用 UNION ALL 会不会更高效,因为这两个结果集是完全不相交的?
      • @David-W-Fenton:根据要求添加了引文。
      • @David-W-Fenton:“你的第二个查询不是更有效吗...?” - 这是上述引用之一的另一句话:“作为用户,为什么我必须花费时间和精力来确定某些 DISTINCT 是否会影响性能以及省略它在逻辑上是否安全? " C. J. Date (2009):SQL 和关系理论:如何编写准确的 SQL 代码,第 78 页。
      • 用于设计我们都使用的 RDBMS 的关系数据库理论已经与现实相去甚远。在我看来,在我们实际实施这些新理论之前,它们只不过是“有趣”(如果那样的话)。
      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多