Sql Oracle空字符串/NULL

Sql Oracle空字符串/NULL,sql,sql-server,oracle,Sql,Sql Server,Oracle,我必须编写一个对MS SQL Server和Oracle有效的SQL SELECT语句。我必须使用旧的客户数据库,因此我无法更改数据库设计中的任何内容 问题是该表有一个可空的列“project”,它是一个varchar,在某些情况下填充了一个空字符串,oracle将其转换为NULL。 那么,如何选择具有非空“项目”的所有列 WHERE project IS NOT NULL works for oracle WHERE project <> ''

我必须编写一个对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
项目不为NULL的地方适用于oracle
项目“”为MS工作的位置
其中项目不为NULL且项目“”适用于MS,但不适用于Oracle
谢谢, Marko

事实:

  • Oracle将空转换为空
  • SQL Server不翻译
因此,如果您有一个具有相同内容的Oracle和SQL Server数据库,结果是相同的,这是您真正想要的

where (project is not null OR project <> '')
其中(项目不为null或项目“”)

由于条件
''=''
仅在SQL Server中为真(相当于
''不为空
),且条件
''为空
仅在Oracle中为真,因此可以使用以下方法:

WHERE ( project > '' AND '' = '')              -- for SQL-Server
   OR ( project IS NOT NULL AND '' IS NULL)    -- for Oracle
请注意,如果您的值仅为空格,则SQL Server和Oracle将对它们进行不同的处理。测试

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


这是因为Oracle将空字符串计算为NULL。值得注意的是,如果第一个表达式为NULL,Oracle不会计算
NULL(),但是,它确实是这样工作的。

这将包含SQL Server中的空字符串。在Oracle中,空字符串被翻译为null,因此Oracle和SQL的结果与写StimeMeNT类似,编写一个在java和C++中都有效的代码语句。
select *
  from table
 where nullif(project, '') is not null