繁体   English   中英

Oracle:NULL与EMPTY字符串之间的区别

[英]Oracle:Difference between NULL and EMPTY string

由于Oracle行为,我的查询未返回任何值。

问题是这样的: 甲骨文插入数据时,但不选择回数据时,考虑空字符串NULL

这不是Oracle 9i为什么将空字符串视为NULL的重复项 因为在这里我不是要问这个问题的原因,我很清楚原因,我是在寻求解决这个问题的方法。

这是我的表结构

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

插入值时,oracle将接受

插入测试值(1,'');

我发现内部oracle将零长度的字符串转换为NULL并存储

但是我的查询

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

(输入是从前端传递的,有时会有空字符串)
不会返回任何结果
由于性能问题,我无法编写动态查询

之前曾遇到此问题的人请让我知道如何比较EMPTY STRING和NULL

问题在于,Oracle(默认情况下)将空字符串视为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>')

这是Oracle最令人讨厌的功能之一-在其他数据库产品中找不到。 对于Oracle的所有其他其他优点,您将不得不忍受它-并且要准备好学习曲线不是很快。

要检查null是否相等,最好的方法是显式地编写您在做什么,而不是使用using头。 例如:

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

这将使您自己以及以后的其他人现在(尤其是以后)调试,维护和修改代码变得容易得多。 也有其他解决方案,但是将来它们可能会使其他人感到困惑。 例如,这是我不会使用的(出于几个原因):

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

尽管显然用更少的键入即可达到相同的结果。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM