SQL Server与Oracle中具有Null值的列

时间:2016-12-23 14:35:43

标签: sql-server oracle null

在Oracle中:=''且'为null'返回NULL值

 SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH NULL VALUES
 SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH NULL VALUES

两个查询都返回相同的行集。

在Microsoft SQL中:

SELECT COL1 FROM TABLE WHERE COL1='' --> RETURN COL1 WITH <BLANK> VALUES
SELECT COL1 FROM TABLE WHERE COL1 IS NULL --> RETURN COL1 WITH <NULL> VALUES

这里第一个和第二个查询返回不同的行集。

为什么Microsoft SQL结果集和Oracle结果集之间存在差异?

如何在Microsoft SQL中检索这两组行? (值为''和值为NULL)。

3 个答案:

答案 0 :(得分:0)

要检索这两组数据,您可以使用break

isnull

Oracle会自动将空字符串转换为空值,而sql server则不会,这就是结果集不同的原因。

您可以在此处找到更多相关信息: Why does Oracle 9i treat an empty string as NULL?

答案 1 :(得分:0)

在SQL Server中''不为空。在Oracle中,x char := ''中的PL/SQL有点复杂,但varchar2空字符''null完全相同,如here所述如果是查询,则为varchar2,因此条件COL = ''永远不会成立。

如果您需要适用于两个数据库的条件,请使用coalesce函数。

select * from TAB 
  where coalesce(COL,'SOME_UNIQUE_STRING') = coalesce(FILTER_PARAM, 'SOME_UNIQUE_STRING')

COLUMN等于FILTER时,此类条件应返回行,并且两者都为空或空字符串。

答案 2 :(得分:0)

要避免定义唯一字符串,可以使用case语句。

这样我们在col或null时将col设置为相同的值进行比较。由于我所知的案例是DBMS独立的,因此这应该适用于两者。

SELECT *
FROM Table
WHERE case when col is NULL or col = '' then 1 else 0 end = 1