1

我正在使用 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

4

1 回答 1

2

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

要在 a 的子句中使用NULL指示符,或者您需要使用WHERESELECTUPDATEDELETEIS 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

或等效的UPDATEDELETESQL,具体取决于所需的功能。

如果COLUMN_1有可能,NULL我们将在将数据提取到游标中以及尝试将 a 更新/添加到表时使用空指示符- 但在子句中NULL匹配 a并不那么简单。NULLWHERE

因为NULL不包含值,所以我们不能在WHERE语句中使用 null 指示符,如下所示:

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

由于 aWHERE中的工作子句SELECT可以转移到其他语句,这也适用于在执行 anUPDATE或 a时找到完全匹配DELETE


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

于 2016-04-12T14:46:43.637 回答