我必须编写一个对MS SQL Server和Oracle有效的SQL SELECT语句。我必须使用旧的客户数据库,所以我不能改变数据库设计中的任何内容......
问题是该表有一个可为空的列'project',它是一个varchar,在某些情况下填充了一个空字符串 - 由oracle转换为NULL。 那么如何选择所有具有NON空“项目”的列?
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
谢谢, 马尔科
答案 0 :(得分:7)
因为条件'' = ''
仅在SQL-Server中为真(它等同于'' IS NOT NULL
)且条件'' IS NULL
仅在Oracle中为真,您可以使用:< / p>
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) 。
答案 1 :(得分:2)
您可以使用NULLIF()
和SQL Server中提供的select *
from table
where nullif(project, '') is not null
(它是ANSI标准的一部分)。
NULLIF()
它的工作原理是因为Oracle将空字符串计算为NULL。值得注意的是,如果第一个表达式为NULL,Oracle不评估{{1}},但它确实以这种方式工作。
答案 2 :(得分:-2)
事实:
因此,如果您的Oracle和SQL Server数据库具有相同的内容,结果是相同的,您真正想要的
where (project is not null OR project <> '')