【问题标题】:Compare String in Oracle Case When在 Oracle 案例中比较字符串时
【发布时间】:2017-06-05 02:50:14
【问题描述】:

我遇到了 oracle case 的问题。

SELECT CASE WHEN '7C54D3E133830A78E040A8C010014B7D' != ''
            THEN '7C54D3E133830A78E040A8C010014B7D'
            WHEN 'e84a4433966c4b8996ce34905acff63d' != ''
            THEN 'e84a4433966c4b8996ce34905acff63d'
            WHEN '7faa9126b1c6412fa58375ab2b2be1db' != ''
            THEN '7faa9126b1c6412fa58375ab2b2be1db'
            ELSE NULL
 END
 FROM DUAL

这个查询总是返回 null,尽管很明显结果应该是第一种情况。我是否遗漏了有关 oracle 中字符串比较的内容?

【问题讨论】:

  • 您确定您正在使用此查询和/或您正在正确读取输出吗?
  • 是的,输出为空。这个查询实际上来自一个调试过的插入查询,它总是插入空值,我很好奇为什么,所以我把它剪掉并在选择查询上执行它,它返回 null
  • Oracle没有空字符串,而是null

标签: sql oracle case


【解决方案1】:

您正在检查字符串与空字符串,因此有问题;在Oracle中你最好检查你的字符串is not null:

SELECT CASE WHEN '7C54D3E133830A78E040A8C010014B7D' is not null
            THEN '7C54D3E133830A78E040A8C010014B7D'
            WHEN 'e84a4433966c4b8996ce34905acff63d' is not null
            THEN 'e84a4433966c4b8996ce34905acff63d'
            WHEN '7faa9126b1c6412fa58375ab2b2be1db' is not null
            THEN '7faa9126b1c6412fa58375ab2b2be1db'
            ELSE NULL
 END
 FROM DUAL 

关于Oracle对空字符串和null的处理方式,here你发现更多

一个例子:

select q'['' = '']'         , case when '' = ''            then 'YES' else 'NO' end from dual union all
select q'['' is null]'      , case when '' is null         then 'YES' else 'NO' end from dual union all 
select q'['' = null ]'      , case when '' = null          then 'YES' else 'NO' end from dual union all 
select q'[null = null]'     , case when null = null        then 'YES' else 'NO' end from dual union all 
select q'[null is null]'    , case when null is null       then 'YES' else 'NO' end from dual union all 
select q'['' != '']'        , case when '' != ''           then 'YES' else 'NO' end from dual union all
select q'['' is not null]'  , case when '' is not null     then 'YES' else 'NO' end from dual union all
select q'['' != null ]'     , case when '' != null         then 'YES' else 'NO' end from dual union all
select q'[null != null]'    , case when null != null       then 'YES' else 'NO' end from dual union all
select q'[null is not null]', case when null is not null   then 'YES' else 'NO' end from dual

给予:

'' = ''           NO
'' is null        YES
'' = null         NO
null = null       NO
null is null      YES
'' != ''          NO
'' is not null    NO
'' != null        NO
null != null      NO
null is not null  NO

总之,在谈论NULL 时,您可以依靠的唯一检查是: IS [NOT] NULL

【讨论】:

  • 很有趣,但是空字符串的语义应该与非空字符串不同吗?
  • @TimBiegeleisen:伟大的甲骨文毫无意义!所以 Aleksej 是对的,所以赞成
  • @TimBiegeleisen:说实话,我完全不知道 :)。我将简单地引用 Justin Cave:“我相信答案是 Oracle 非常非常古老。”
【解决方案2】:

嗯,这种行为的原因是Oracle没有空字符串,而是null;这就是为什么

   select case when 'abc' != ''  
      ....

其实是

   select case when 'abc' != null

并且由于anything != nullnulltruefalsenull 布尔逻辑)所有when 不返回trueelse 被执行。 正确的语法是

   SELECT CASE WHEN '7C54D3E133830A78E040A8C010014B7D' IS NOT NULL
               THEN '7C54D3E133830A78E040A8C010014B7D'
               WHEN 'e84a4433966c4b8996ce34905acff63d' IS NOT NULL
               THEN 'e84a4433966c4b8996ce34905acff63d'
               WHEN '7faa9126b1c6412fa58375ab2b2be1db' IS NOT NULL
               THEN '7faa9126b1c6412fa58375ab2b2be1db'
               ELSE NULL
          END
     FROM DUAL

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 2019-12-18
    • 2015-06-17
    • 2015-11-19
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多