PL / SQL - 带有局部变量的WHERE内的CASE

时间:2014-05-23 08:26:55

标签: oracle plsql where-clause

我想从基于局部变量的WHERE子句中选择表中的一些记录 - 这是一个"正确的"这样做的方式?我知道它有效,但我认为某处应该有更好的方法:)

所以说我有一个带有一些参数的过程,比如p_type,现在我想从表中选择一些记录,如果用户传递了一个有效的p_type参数,我将只选择指定类型的记录。否则我将选择所有记录 - 不需要进行类型检查。

"拉梅"方法是检查TYPE是否为非NULL并使用或不使用WHERE子句进行正确的SELECT。但我这样做:

SELECT ID, TYPE, NAME FROM MY_TABLE t WHERE
  TYPE = 
    CASE p_type
     WHEN NULL THEN t.TYPE
     ELSE p_type
    END;

这样做可以吗?确定它有效:)

1 个答案:

答案 0 :(得分:0)

如果condition为FALSE,则

LNNVL返回TRUE;如果condition为TRUE,则返回FALSE。但最重要的是,如果条件为UNKNOWN,则返回TRUE。

因为,LNNVL颠倒了我们的条件,我们必须使用倒置条件。

在此示例中,type = p_type将成为lnnvl(type != p_type)

SELECT ID, TYPE, NAME 
FROM MY_TABLE t 
WHERE LNNVL(TYPE != p_type);

示例fiddle

但是,在这种情况下,使用NVL或COALESCE非常简单。

where type = COALESCE(p_type,type)