COBOL embedded SQL 的 WHERE 子句中可以使用 NULL 指示符吗?

Can NULL indicators be used in the WHERE clause for COBOL embedded SQL?

我在 CICS 屏幕上工作,用户可以在其中查询、添加、更新或删除 table 中的数据。在我的一个 table 中,唯一键由 5 个字段组成,其中 2 个可以为 NULL。在我的光标中,我必须使用

AND   (COLUMN_1 = :V??-REC.COLUMN-1 OR COLUMN-1 IS NULL)

然后我必须 运行 对结果进行评估并显示最接近的匹配结果。

我目前如何找到 NULL 条目:

EXEC SQL
    DECLARE V000001-CUR CURSOR FOR
    SELECT DOCM_N,
           DOCM_TYPE_T,
           REJ_RESN_C
    FROM   V000001
    WHERE  DOCM_N      = :V000001-REC.DOCM-N
    AND    DOCM_TYPE_T = :V000001-REC.DOCM-TYPE-T
    AND   (REJ_RESN_C  = :V000001-REC.REJ-RESN-C OR
           REJ_RESN_C IS NULL)
END-EXEC

我在网上看到,使用更新或插入时,可以使用空指示符将 NULL 插入 table。

例如:

EXEC SQL
    UPDATE V000001
    SET    DOCM_N      = :V000001-REC.DOCM-N,
           DOCM_TYPE_T = :V000001-REC.DOCM-TYPE-T,
           REJ_RESN_C  = :V000001-REC.REJ-RESN-C
                           :WS-REJ-RESN-C-IND
    WHERE  DOCM_N      = :WW-DOCM-N
    AND    DOCM_TYPE_T = :WW-DOCM-TYPE-T
END-EXEC

我的问题。我可以在 WHERE 子句中使用 null 指示符吗?

如:

EXEC SQL
    DECLARE V000001-CUR CURSOR FOR
    SELECT DOCM_N,
           DOCM_TYPE_T,
           REJ_RESN_C
    FROM   V000001
    WHERE  DOCM_N      = :V000001-REC.DOCM-N
    AND    DOCM_TYPE_T = :V000001-REC.DOCM-TYPE-T
    AND    REJ_RESN_C  = :V000001-REC.REJ-RESN-C
                            :WS-REJ-RESN-C-IND
END-EXEC

!!! 对于 DB2 版本 8 及更高版本 !!!

要在 WHERE 子句中为 SELECTUPDATEDELETE 使用 NULL 指标,您需要使用 IS NOT DISTINCT FROM

因为 NULL 是一个未知数,它没有值,所以它永远不能等于任何东西 - 甚至另一个 NULL.

因此,当您希望通过匹配用户输入来查找条目时 - 在将用户输入移至必填字段之后 - 您通常会使用如下内容:

EXEC SQL
    SELECT COLUMN_1,
           COLUMN_2,
           COLUMN_3
    FROM   V000001
    WHERE  COLUMN_1 = :V000001-REC.COLUMN-1
    AND    COLUMN_2 = :V000001-REC.COLUMN-2
    AND    COLUMN_3 = :V000001-REC.COLUMN-3
END-EXEC

或等效的 UPDATEDELETE SQL 取决于所需的功能。

如果 COLUMN_1 有可能成为 NULL 我们将在将数据提取到游标中以及尝试 update/add 一个 NULL 时使用空指示符table - 但匹配 WHERE 子句中的 NULL 并不那么简单。

因为 NULL 不包含值,我们不能像这样在 WHERE 语句中使用空指示符:

WHERE COLUMN_1 = :V000001-REC.COLUMN-1 :COLUMN-1-IND

一旦开始使用括号和 OR xxxx IS NULL(见下文),您需要开始编程进行各种其他检查,这样您就不会检索、更新或删除错误的行

WHERE (COLUMN_1 = :V000001-REC.COLUMN-1 OR COLUMN_1 IS NULL)

WHERE子句中使用空指示符的正确方法是这样的:

EXEC SQL
    SELECT COLUMN_1,
           COLUMN_2,
           COLUMN_3
    FROM   V000001
    WHERE  COLUMN_1 IS NOT DISTINCT FROM
                      :V000001-REC.COLUMN-1
                         :COLUMN-1-IND
    AND    COLUMN_2 = :V000001-REC.COLUMN-2
    AND    COLUMN_3 = :V000001-REC.COLUMN-3
END-EXEC

由于 SELECT 中的工作 WHERE 子句可以转移到其他语句,这也适用于在执行 UPDATE 或 [=18= 时查找精确匹配]


更多阅读:http://www.toadworld.com/platforms/ibmdb2/w/wiki/6842.nulls