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.
Bitte senden Sie einige Beispieldaten, benötigte Ergebnis und was Sie aus Ihrer Anfrage bekommen – Aleksej
würde diese nicht viel einfacher zu lesen? 'coalesce (f.LP_NEW, f.LP_BASIC)' – Kritner
@Kritner 'Coalesce' ist besser. 'Nvl' vergleicht beide Werte,' coalesce' stoppt, sobald ein Wert gefunden wird. – JohnHC