【问题标题】:Oracle:Difference between NULL and EMPTY stringOracle:NULL 和 EMPTY 字符串之间的区别
【发布时间】:2016-08-16 05:54:34
【问题描述】:

由于 oracle 的行为,我的查询没有返回任何值。

问题是这样的: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 将接受

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

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

但是我的查询

从测试中选择 * WHERE NAME = INPUT;(INPUT='')

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

之前遇到过这个问题的人请告诉我如何比较 EMPTY STRING 和 NULL

【问题讨论】:

  • @vkp 我不是在问原因。我要求解决这个问题。所以这不是重复的。在问这个问题之前,我已经解决了这个问题。
  • 只是为了支持 OP 的反对意见:我看不出他/她的问题怎么可能与“为什么...”重复(尽管我毫不怀疑它是重复的东西;以前肯定有人问过这个问题,也许它只是没有出现在快速搜索中。)
  • 例如,stackoverflow.com/questions/13411819/… 的副本以及该线程中链接的其他问题。

标签: sql oracle


【解决方案1】:

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

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

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

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

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

虽然它显然会以更少的输入达到相同的结果。

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

【讨论】:

  • 你也可以使用WHERE LNNVL(NAME <> INPUT)
  • 没错……但是……这正是我不喜欢的噱头之一。在一个小型组织中,我可能有一个 C# 开发人员查看我的代码,我当然希望他能立即理解“我的方式”编写此代码。他们肯定要谷歌 LNNVL,想想为什么我在检查相等性时使用 ,...
  • @WernfriedDomscheit - 该线程已有三年多的历史了,但有人刚刚投了赞成票,所以我又看了一遍......请注意,LNNVL 不能作为替代方案;即使一项为 NULL 而另一项不是,它也会返回 true。正确的替代方法是使用 DECODE,如decode(name, input, 1) = 1
【解决方案2】:

问题是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 将空字符串视为 NULL - 除非它不是。例如,比较 translate('abc', 'a', '') 与 regexp_replace('abc', 'a', '')。
  • @mathguy 。 . .或者,Oracle 接受 NULL 字符串值,您可能不会想到它们。
  • where name = ''where name = NULL 将返回空集,不会失败。
猜你喜欢
  • 2017-01-29
  • 2013-05-26
  • 1970-01-01
  • 2011-10-27
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2011-06-15
相关资源
最近更新 更多