2016-04-22 113 views
0

我处于由于oracle行为而导致查询未返回任何值的情况。
Oracle:NULL和EMPTY字符串之间的区别

问题是这样的:Oracle considers EMPTY STRING as NULL when INSERTING DATA but not when SELECTING BACK the data

这不是Why does Oracle 9i treat an empty string as NULL?的重复,因为在这里我不是要问这个问题的原因,我很清楚原因,我要求解决这个问题。

这是我的表结构

CREATE TABLE TEST 
    (
     ID   NUMBER not null, 
     NAME VARCHAR2(255) 
    ) 

插入值oracle会接受

INSERT INTO TEST值(1, '')时;

我发现内部甲骨文转换字符串长度为零,为NULL并存储

但我查询

SELECT * FROM TEST WHERE NAME =输入;(INPUT = '')

(输入从前端过去了,有时有空字符串)
不会返回任何结果
我不能写动态由于性能问题

有人谁遇到这个问题之前,请让我知道如何比较用NULL

+0

[为什么Oracle 9i将空字符串视为NULL?](http://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as- null) –

+1

@vkp我不是要求原因。我要求解决这个问题。所以这不是重复的。在问这个问题之前,我已经通过了这个问题。 – shreesha

+0

只是为了反驳OP的反对意见:我不明白他/她的问题怎么可能是“为什么...”的重复(尽管我毫不怀疑它是某件事的重复;其他人一定会问这个问题之前,也许它只是不显示在一个快速搜索。) – mathguy

回答

0

这是甲骨文最讨厌的特征之一 - 其他数据库产品未找到。对于甲骨文的其他所有优势,您将不得不忍受,并且要准备好学习曲线不是很快。

要检查空值是否相等,最好的方法是明确地写下你在做什么,而不是使用噱头。例如:

... where NAME = INPUT or (NAME IS NULL and INPUT IS NULL) 

这将使人们更方便自己,和别人追你,调试,维护和修改代码,现在,尤其是更高版本。还有其他解决方案,但他们未来可能会混淆他人;例如,这是我不会使用的东西(出于以下几个原因):

... where NAME || 'z' = INPUT || 'z' 

虽然很明显用较少的键入会达到相同的结果。

还有一件事,在大多数情况下,您不应该在结果行中包含NULL,因为它们将NULL视为“相等” - 由于某种原因,值为NULL,并且在大多数情况下,如果使两个NULL值相等,预期的结果。

+0

你也使用'WHERE LNNVL(NAME <> INPUT)' –

+0

真的......但是......这正是我不喜欢的那些噱头之一。在一个小型组织中,我可能会有一位C#开发人员查看我的代码,我当然希望他能立即明白我写这篇文章的“我的方式”。他们肯定会不得不谷歌LNNVL,考虑为什么我使用<>当我检查平等,... – mathguy

3

问题空字符串查询的是,甲骨文(默认)将空字符串视为NULL。因此:

where name = '' 

是一样的:

where name = NULL 

两者总是失败(因为它们返回NULL)。

您可以通过多种方式解决此问题。一种方法是:

where (name = INPUT or name is null and INPUT is null) 

或者,如果你知道有一个无效的名字:

where coalesce(name, '<invalid>') = coalesce(INPUT, '<invalid>') 
+1

Oracle将空字符串视为NULL - 除非不存在。比较,例如,translate('abc','a','')与regexp_replace('abc','a','')。 – mathguy

+0

@mathguy。 。 。或者,Oracle接受'NULL'字符串值,你可能不希望他们。 –

相关问题