Oracle PL/SQL-带有局部变量的情况

Oracle PL/SQL-带有局部变量的情况,oracle,plsql,where-clause,Oracle,Plsql,Where Clause,我想根据局部变量从带有WHERE子句的表中选择一些记录——这是一种“正确”的方法吗?我知道这很有效,但我认为应该有更好的方法:) 假设我有一个带有参数的过程,比如p_类型,现在我想从表中选择一些记录,如果用户传递了一个有效的p_类型参数,我将只选择指定类型的记录。否则,我将选择所有记录-无需类型检查 “Lame”方法是检查类型是否不为NULL,并使用WHERE子句或不使用WHERE子句进行适当的选择。但我是这样做的: SELECT ID, TYPE, NAME FROM MY_TABLE t W

我想根据局部变量从带有WHERE子句的表中选择一些记录——这是一种“正确”的方法吗?我知道这很有效,但我认为应该有更好的方法:)

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

“Lame”方法是检查类型是否不为NULL,并使用WHERE子句或不使用WHERE子句进行适当的选择。但我是这样做的:

SELECT ID, TYPE, NAME FROM MY_TABLE t WHERE
  TYPE = 
    CASE p_type
     WHEN NULL THEN t.TYPE
     ELSE p_type
    END;
这样做可以吗?当然它可以工作:)

如果条件为FALSE,则返回TRUE;如果条件为TRUE,则返回FALSE。但最重要的是,如果条件未知,则返回TRUE

因为LNNVL反转了我们的条件,所以我们必须使用反转的条件

在本例中,
type=p\u type
将变成,
lnnvl(type!=p\u type)

样品

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

where type = COALESCE(p_type,type)

你好,NVL操作员不好吗?请参阅文档:或者,如果它起作用,那么它很好,但它有点试图用你的左手填满你的右口袋。有更简单的方法可以做到这一点。太好了!有人能告诉我如何在我的例子中使用LNNVL()吗?where type=nvl(p_type,t.type)谢谢-非常感谢。回答得好,谢谢。更好的是:where type=nvl(p_-type,t.type)还是where lnvl(type!=p_-type)?对于将来使用我的代码的人来说,第一个可能更容易理解,我认为…@user1076,是的,第一个更好。
where type = COALESCE(p_type,type)