2014-07-23 82 views
0

我想我在Oracle数据库(10g)中遇到了PL/SQL中一个相当简单的问题,我希望你们中的一个能够帮助我。PL/SQL Oracle条件等于

我试图尽可能地解释这一点,但对我来说很难。 当我尝试比较2个不同表的varchar2值以检查是否需要创建新记录,或者我可以重新使用现有ID的ID时,DB(或I)以错误的方式比较这些值。当两个字段都包含一个值时,这一切都很好,这会导致它理解的'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' '后,它会以正确的方式进行比较。

由于提前,

丹尼斯

回答

0

您的方法很好,除非其中一个值可以是空格。做比较的“标准”的方法是明确的比较NULL

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

在Oracle中,对字符串的比较是由甲骨文对待空字符串为NULL的事实阻碍。这是Oracle的一个特点,而不是其他数据库中的问题。

+0

您需要括号:col1 = col2或(col1为空,col2为空) – Andrej

+1

@Andrej。 。 。虽然括号是一个好主意,但它们不是*必需的*。 '和'具有比'或'更高的优先级。 –

+1

我认为你发布的条件是最干净的。那谢谢啦! – Dennis

0

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

维基百科(原来的ISO规范,但我不能访问它):

由于null不是任何数据域的成员,它不被认为是“价值”,而是一个标记(或占位符)表示没有价值。因此,与Null进行比较永远不会导致True或False,但总是会出现在第三个逻辑结果Unknown中。

正如Jan Spurny所述,您可以使用LNNVL进行比较。但是,当比较两个值为NULL时实际进行比较是错误的。

0

这确实是一个简单实用的方式来比较空。 由于NULL不等于NULL,所以不能直接比较NULLS。 您必须提供您自己想要比较的逻辑,以及您使用NVL()所做的工作。 请记住,您将NULLS视为空间,因此在您的案例中,在一个表中,“在另一个表中等于NULL”。

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