SQL Oracle where 子句中的查询

SQL Query in Oracle where clause

我有 table Groups 有 3 行,IDGROUP_NAMEPARENT_GROUP_ID,table 本身提供了基本的组-子组功能。示例是:如果我的组名称是 - "First Group",ID = 1,并且它有一个名为 "Sub Group" 的子组,ID = 2,并且 PARENT_GROUP_ID = 1;这意味着 Sub Group 是 ID = 1 组的子组。我的问题是我有一个程序,它根据参数加载数据(pn_parent_group_id 是一个数)

CURSOR c1 IS
SELECT * FROM GROUPS WHERE PARENT_GROUP_ID = pn_parent_group_id;

当我将任何 pn_parent_group_id 发送到过程中时,此查询工作正常,它找到所有必要的子组,但是当我将 NULL 发送到 pn_parent_group_id 时,它工作错误,因为它应该 return 那些没有 parent_group_id 的(意味着只有父组)。我知道我的解释不够,但我希望你明白了,任何帮助将不胜感激!

Null 永远不等于 Null。所以你需要为你的游标添加一个 null 的显式测试。

CURSOR c1 IS
    SELECT * FROM GROUPS 
     WHERE PARENT_GROUP_ID = pn_parent_group_id
     or (pn_parent_group_id is null and parent_group_id is null);

您可能对 SYS_OP_MAP_NONNULL 函数感兴趣,它允许比较 NULL = NULLTRUE

CURSOR c1 IS
   SELECT * FROM GROUPS
   WHERE SYS_OP_MAP_NONNULL(parent_group_id) = SYS_OP_MAP_NONNULL(pn_parent_group_id);

此功能未直接记录在 Oracle 文档中,但确实出现在主题文档中 - 因为它已经存在了很长时间,所以我认为它不太可能被删除。一如既往地使用这些东西,请自行决定使用。