2016-11-02 6 views
2

ich habe ein Problem mit meiner SQL-Abfrage und weiß nicht, wie es zu lösen:Oracle SQL - CASE WHEN THEN ELSE ELSE Teil ignorieren

Die Ausgabetabelle besteht aus.

1. SERIALNR VARCHAR(26) NOT NULL 
2. LP_BASIC VARCHAR(20) NOT NULL 
3. LP_NEW  VARCHAR(20) 
4. SCORE  NUMBER(20) NOT NULL 
5. CURRENT_LP VARCHAR(20) 

Die Abfrage selbst funktioniert gut und enthält keine Fehler.

Die LP_BASIC Säule wird immer während der LP_NEW ist ein optionales Feld gefüllt. CURRENT_LP sollte immer angezeigt werden LP_NEW sonst LP_BASIC (wenn nicht leer ist) (die nie leer ist). Das Problem ist, dass das "ELSE f.LP_BASIC" -Part nicht funktioniert. Es sollte LP_BASIC Wert zurückgegeben werden, wenn kein LP_NEW Datensatz gefunden wird, sondern stattdessen nur ein leeres Feld zurückgegeben wird.

SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    f.SCORE, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM (
     SELECT 
      SERIALNR, 
      MAX(SCORE) MAX_ID 
     FROM 
      EAPS.PS_TC_SM 
     GROUP BY 
      SERIALNR 
    ) x 
INNER JOIN 
    EAPS.PS_TC_SM f 
ON 
    f.SERIALNR= 
    x.SERIALNR 
AND 
    f.SCORE = 
    x.MAX_ID 

Jede Hilfe geschätzt.

Vielen Dank im Voraus.

Rob.

UPDATE (gelöst)

Die LP_NEW Spalte war nicht null, da in ihm ein einziger Raum char war, so dass die "IS NULL" hat nicht funktioniert.

+0

Bitte senden Sie einige Beispieldaten, benötigte Ergebnis und was Sie aus Ihrer Anfrage bekommen – Aleksej

+0

würde diese nicht viel einfacher zu lesen? 'coalesce (f.LP_NEW, f.LP_BASIC)' – Kritner

+1

@Kritner 'Coalesce' ist besser. 'Nvl' vergleicht beide Werte,' coalesce' stoppt, sobald ein Wert gefunden wird. – JohnHC

Antwort

2

(Dies war zu lang für einen Kommentar, also als Antwort gepostet)

Wie bereits in den Kommentaren erwähnt, Ihre CASE Aussage ist völlig in Ordnung; Sie sollten Ihre Eingabedaten erneut prüfen.

Beispiel, die die Richtigkeit Ihres Ansatz mit gefälschten Daten zeigen:

with v_input(serialnr, lp_basic, lp_new) as (
    select 
    level, 
    'basic_' || to_char(level), 
    (case when mod(level, 2) = 0 then 'new_' || to_char(level) else null end) 
    from dual 
    connect by level <= 10) 
SELECT 
    f.SERIALNR, 
    f.LP_BASIC, 
    f.LP_NEW, 
    CASE 
    WHEN 
     f.LP_NEW 
     IS NOT NULL 
     THEN 
      f.LP_NEW 
    ELSE 
     f.LP_BASIC 
    END 
AS CURRENT_LP 
FROM v_input f 
+0

Danke. Es gab ein einzelnes Leerzeichen in allen LP_NEW-Datensätzen, das verhinderte, dass die CASE-Anweisung funktionierte, daher änderte ich die IS NULL in = '' und nun funktioniert das Ganze wie erwartet. Ich bin neu auf SQL und dachte nicht daran könnte passieren. – Robama