2017-01-20 1 views
2

Ich habe ein Problem mit Oracle Case wenn.Vergleichen String in Oracle Case Wenn

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

Diese Abfrage gibt immer null zurück, obwohl es offensichtlich ist, dass das Ergebnis der erste Fall sein sollte. Fehle ich etwas über String-Vergleich in Orakel?

+0

Sind Sie sicher, dass Sie diese Abfrage verwenden und/oder Sie die Ausgabe richtig lesen? –

+0

Ja, die Ausgabe ist null. diese Abfrage ist eigentlich von einer Debug-Abfrage einzufügen, es fügt immer null Wert, ich bin neugierig warum, also ich schneide es und exe es auf ausgewählte Abfrage, gibt es null – deckamaha

+0

Oracle hat nicht * leere Zeichenfolge *, aber 'null ' –

Antwort

8

Sie überprüfen Zeichenketten gegen eine leere Zeichenkette und haben somit Probleme; in Oracle sollten Sie besser überprüfen, ob Ihr String 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 

Über die Art und Weise Oracle leeren String und null behandelt, here finden Sie etwas mehr

Ein Beispiel:

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 

gibt:

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

Mit einem Wort, die einzige Kontrolle, die Sie können verlassen, wenn es um NULL sprechen, ist: IS [NOT] NULL

+0

Interessant, aber gibt es einen Grund, warum die Semantik der leeren Zeichenfolge anders als eine nicht leere Zeichenfolge sein sollte? –

+0

@TimBiegeleisen: Großartiges Orakel nicht Sinn! Also Aleksej hat recht, also upvote –

+0

@TimBiegeleisen: um ehrlich zu sein, ich habe überhaupt keine Ahnung :). Ich zitiere Justin Cave einfach: "Ich glaube, die Antwort ist, dass Oracle sehr, sehr alt ist." – Aleksej

3

Nun, der Grund für ein solches Verhalten ist, dass Oracle nicht leere Zeichenfolge hat, aber null; deshalb

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

tatsächlich

select case when 'abc' != null 

ist und seit anything != null ist null (true, false, null Booleschen Logik) die alle when nicht zurück true und else ausgeführt wird. Die richtige Syntax ist

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