Oracle where子句中的SQL查询
我有3行的表组,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
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);