PL/SQL Oracle 条件等于
Posted
技术标签:
【中文标题】PL/SQL Oracle 条件等于【英文标题】:PL/SQL Oracle condition equals 【发布时间】: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
的值更改为 ' '
,之后它将以正确的方式进行比较。
提前致谢,
丹尼斯
【问题讨论】:
【参考方案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 ),但我认为它们并不是某种“更好”的方法。
【讨论】:
以上是关于PL/SQL Oracle 条件等于的主要内容,如果未能解决你的问题,请参考以下文章
如何将 DEFINE 变量设置为等于 PL/SQL 中另一个已定义表的选择