【问题标题】:Oracle empty string/NULLOracle 空字符串/NULL
【发布时间】:2013-12-01 08:02:48
【问题描述】:

我必须编写一个对 MS SQL Server 和 Oracle 有效的 SQL SELECT 语句。我必须使用旧的客户数据库,所以我无法更改数据库设计中的任何内容...

问题是该表有一个可为空的列“project”,它是一个 varchar,在某些情况下填充了一个空字符串 - 它由 oracle 转换为 NULL。 那么如何选择所有具有非空“项目”的列?

WHERE project IS NOT NULL                   works for oracle
WHERE project <> ''                         works for MS
WHERE project IS NOT NULL AND project <> '' works for MS, but not for Oracle

谢谢, 马尔科

【问题讨论】:

  • 这就像写一个在Java和C++中都有效的代码语句:)

标签: sql sql-server oracle


【解决方案1】:

事实:

  • Oracle 将空转换为 NULL
  • SQL Server 不翻译。

所以如果你有一个 Oracle 和 SQL Server 数据库具有相同的内容,结果是一样的,你真正想要的东西

where (project is not null OR project <> '')

【讨论】:

【解决方案2】:

因为条件'' = '' 只会在 SQL-Server 中为真(它等同于'' IS NOT NULL)而条件'' IS NULL 只会在 Oracle 中为真,所以您可以使用这个:

WHERE ( project > '' AND '' = '')              -- for SQL-Server
   OR ( project IS NOT NULL AND '' IS NULL)    -- for Oracle

请注意,如果您的值只是空格,那么 SQL-Server 和 Oracle 之间的处理方式将有所不同。测试 SQL-Fiddle-1 (Oracle)SQL-Fiddle-2 (SQL-Server)

【讨论】:

    【解决方案3】:

    您可以使用NULLIF(),它在SQL ServerOracle 中都可用(它是ANSI 标准的一部分)。

    select *
      from table
     where nullif(project, '') is not null
    

    之所以有效,是因为 Oracle 将空字符串评估为 NULL。值得注意的是,如果第一个表达式为 NULL,Oracle 不会评估 NULLIF(),但它确实以这种方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 2010-09-17
      • 1970-01-01
      • 2017-03-31
      • 2023-03-12
      • 2014-09-22
      • 2011-11-25
      • 2020-10-10
      相关资源
      最近更新 更多