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
子句中为 SELECT
、UPDATE
或 DELETE
使用 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
或等效的 UPDATE
或 DELETE
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
我在 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
子句中为 SELECT
、UPDATE
或 DELETE
使用 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
或等效的 UPDATE
或 DELETE
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