2017-01-20 22 views
2

Oracleの場合に問題が発生しました。Oracleケースの文字列を比較する場合

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

このクエリは、結果が最初のケースであるはずですが、常にnullを返します。私はoracleで文字列の比較について何か不足していますか?

+0

このクエリを使用していますか、または出力を正しく読み込んでいますか? –

+0

はい、出力はnullです。 この問合せは実際にはデバッグされた挿入問合せからのものですが、常にnull値が挿入されるため、私はそれをカットしてselectクエリで実行します。nullを返します。 – deckamaha

+0

Oracleには空の文字列はありません。 ' –

答えて

8

文字列をチェックしているときに空の文字列が表示されるため、問題が発生します。

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 

ができます::Oracleは、あなたがもっと何か

例を見つけるhere、空の文字列とヌルを扱う方法について

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 

:オラクルでは、あなたはより良いis not nullあなたの文字列の場合を確認したいです

'' = ''   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

+0

興味深いですが、空文字列のセマンティクスが空でない文字列と異なる必要がある理由はありますか? –

+0

@TimBiegeleisen:素晴らしいOracle非感覚!だからアレクセイは右だから、アップアップ –

+0

@TimBiegeleisen:正直言って、私はまったく考えていない:)。私は単にジャスティン・ケイブを引用します。「答えはオラクルが非常に古くなっていると信じています。 – Aleksej

3

まあ、そのような行動の理由は、Oracle が空の文字列が、nullを持っていないということです。それは

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

が実際に

select case when 'abc' != null 

ている理由だとanything != null以来trueelseが実行されて返さないnulltruefalsenullブール論理)すべてwhenです。 正しい構文は

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