Oracle空字符串/NULL

5
我需要编写一个SQL SELECT语句,它对于MS SQL Server和Oracle都是有效的。我必须与旧客户数据库一起工作,所以不能在数据库设计中更改任何内容...
问题是该表具有可空列“project”,它是一个varchar,在某些情况下填充为空字符串 - 这由Oracle翻译为空值。那么,如何选择所有具有非空“project”的列?
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++中都有效的代码语句 :) - Kombajn zbożowy
3个回答

7

由于条件'' = ''只在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)

2

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

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

它能够工作是因为Oracle将空字符串评估为NULL。值得注意的是,如果第一个表达式为NULL,Oracle不会评估NULLIF(),但如果反过来,则可以正常工作。


-2

事实:

  • Oracle将空值翻译为NULL
  • SQL Server不进行翻译。

因此,如果您拥有一个包含相同内容的Oracle和SQL Server数据库,结果是相同的,这正是您想要的。

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

1
这将包括在SQL Server中的空字符串。 - ypercubeᵀᴹ
在Oracle中,空字符串被转换为NULL,因此使用此语句时,来自Oracle和SQL的结果是相同的。 - lordkain
1
在SQL Server中返回了错误的结果。 - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接