【问题标题】:Columns with Null Values in SQL Server vs OracleSQL Server 与 Oracle 中具有空值的列
【发布时间】:2017-05-09 06:29:25
【问题描述】:

在 Oracle 中:='' 和 'is 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 的值)。

【问题讨论】:

  • 因为''(empty string)等于NULL。不确定Oracle
  • Oracle中,空字符串会自动转换为null。

标签: sql-server oracle null


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    在 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 并且两者都是空字符串或空字符串时,此类条件应返回行。

    【讨论】:

    • 感谢 Kacper 提供的信息。
    【解决方案3】:

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

    SELECT COL1 FROM TABLE WHERE ISNULL(COL1, '') = ''
    

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多