【问题标题】:PL/SQL Oracle condition equalsPL/SQL Oracle 条件等于
【发布时间】:2014-07-23 10:46:33
【问题描述】:

我认为我在 Oracle 数据库 (10g) 上的 PL/SQL 中遇到了一个相当简单的问题,我希望你们中的一个可以帮助我。

我试图尽可能清楚地解释这一点,但这对我来说很难。 当我尝试比较 2 个不同表的 varchar2 值以检查是否需要创建新记录或者我可以重新使用现有记录的 ID 时,数据库(或我)以错误的方式比较这些值。当两个字段都包含一个值时,一切都很好,这会导致它理解的 'a' = 'a' 。但是当两个字段都为 NULL(或 '' Oracle 将变为 NULL)时,它无法比较字段。

我找到了解决此问题的“解决方案”,但我确信有更好的方法。

rowTable1  ROWTABLE1%ROWTYPE;
iReUsableID INT;

SELECT * INTO rowTable1
FROM TABLE1
WHERE TABLE1ID = 'someID';

SELECT TABLE2ID INTO iReUsableID
FROM TABLE2
WHERE NVL(SOMEFIELDNAME,' ') = NVL(rowTable1.SOMEFIELDNAME,' ');

因此 NVL 将 null 的值更改为 ' ',之后它将以正确的方式进行比较。

提前致谢,

丹尼斯

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您可以使用LNNVL函数(http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions078.htm)并反转条件:

    SELECT TABLE2ID INTO iReUsableID
    FROM TABLE2
    WHERE LNNVL(SOMEFIELDNAME != rowTable1.SOMEFIELDNAME);
    

    【讨论】:

    • 像魅力一样工作。由于这只使用了一半的函数调用量,我假设这也更快?
    【解决方案2】:

    您的方法很好,除非其中一个值可能是空格。进行比较的“标准”方式是显式地与NULL 进行比较:

    WHERE col1 = col2 or col1 is null and col2 is null
    

    在 Oracle 中,字符串的比较受到 Oracle 将空字符串视为 NULL 的事实的阻碍。这是 Oracle 的特性,在其他数据库中没有问题。

    【讨论】:

    • 你需要括号:col1 = col2 or (col1 is null and col2 is null)
    • @Andrej。 . .虽然括号是个好主意,但它们不是需要and 的优先级高于 or
    • 我认为您发布的条件是最干净的。所以谢谢!
    【解决方案3】:

    在 Oracle(或我相信的任何 RDBMS)中,一个 NULL 不等于另一个 NULL。因此,如果要强制将 2 个 NULL 值视为相同,则需要使用您已声明的解决方法。此外,您可能希望将 NULL 值默认为 ''(空)而不是 ''(空格)。

    来自 Wikipedia(最初是 ISO 规范,但我无法访问):

    由于 Null 不是任何数据域的成员,因此它不被视为“值”,而是指示不存在值的标记(或占位符)。因此,与 Null 的比较永远不会导致 True 或 False,但总是会产生第三个逻辑结果,即 Unknown。

    正如 Jan Spurny 所说,您可以使用 LNNVL 进行比较。但是,当被比较的两个值都是 NULL 时,如果说实际上是在进行比较是错误的。

    【讨论】:

      【解决方案4】:

      这确实是一种比较空值的简单且有用的方法。 您不能直接比较 NULLS,因为 NULL 不等于 NULL。 你必须提供你自己的逻辑,你想比较谁,你用 NVL() 做了什么。 请记住,您将 NULLS 视为空间,因此在您的情况下,一个表中的 ' ' 将等于另一个表中的 NULL。

      还有其他一些方法(例如 LNNVL ),但我认为它们并不是某种“更好”的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-30
        • 2019-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多