Oracle where子句中的SQL查询

Oracle where子句中的SQL查询,sql,oracle,where,Sql,Oracle,Where,我有3行的表组,ID,GROUP\u NAME和PARENT\u GROUP\u ID,表本身提供了基本的组-子组功能。示例是:如果我的组名是ID=1的“第一个组”,并且它有一个子组名为ID=2的“子组”,父组ID=1;这意味着子组是ID=1的组的子组。我的问题是我有一个过程,它根据参数加载数据(pn\u parent\u group\u id是一个数字) 当我将任何pn\u parent\u group\u id发送到过程中时,此查询工作正常,它会找到所有必要的子组,但是当我将NULL发送到p

我有3行的表
ID
GROUP\u NAME
PARENT\u GROUP\u ID
,表本身提供了基本的组-子组功能。示例是:如果我的组名是ID=1的“第一个组”,并且它有一个子组名为ID=2的“子组”,父组ID=1;这意味着子组是ID=1的组的子组。我的问题是我有一个过程,它根据参数加载数据(
pn\u parent\u group\u id
是一个数字)


当我将任何
pn\u parent\u group\u id
发送到过程中时,此查询工作正常,它会找到所有必要的子组,但是当我将NULL发送到pn\u parent\u group\u id时,它工作错误,因为它应该返回没有parent\u group\u 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\u OP\u MAP\u NONNULL
函数感兴趣,该函数允许比较
NULL=NULL
TRUE

CURSOR c1 IS
   SELECT * FROM GROUPS
   WHERE SYS_OP_MAP_NONNULL(parent_group_id) = SYS_OP_MAP_NONNULL(pn_parent_group_id);
这个函数没有直接记录在Oracle文档中,但确实出现在主题文档中——因为它已经存在很长一段时间了,我认为它不太可能被删除。像往常一样,使用这些东西时,请自行决定

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