【问题标题】:Can NULL indicators be used in the WHERE clause for COBOL embedded SQL?COBOL 嵌入式 SQL 的 WHERE 子句中可以使用 NULL 指示符吗?
【发布时间】:2016-04-11 09:12:17
【问题描述】:

我正在使用 CICS 屏幕,用户可以在其中查询、添加、更新或删除表中的数据。在我的一张表中,唯一键由 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

网上看过,使用update或者insert的时候可以用null指标往表中插入NULL。

例如:

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 子句中使用空指示符吗?

如:

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

【问题讨论】:

    标签: null cobol cics embedded-sql


    【解决方案1】:

    !!! 对于 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,我们将在将数据提取到游标中以及尝试将NULL 更新/添加到表中时使用空指示符 - 但匹配NULLWHERE 子句中并不那么简单。

    因为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 子句可以转移到其他语句,这也适用于在执行 UPDATEDELETE 时找到完全匹配


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

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 2012-11-05
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2017-05-07
      • 2013-08-10
      相关资源
      最近更新 更多