2017-10-05 1 views
0

Ich habe diese Beispiel Tempentabelle. Ich benutzte die COALESCE im SQL-Server. Ich habe kein Zugriffsrecht, um Tabellen in Oracle zu erstellen. Gibt es in Oracle eine Case-Anweisung, die in SQL Server als COALESCE fungiert?COALESCE in SQL zu Case-Anweisung in Oracle

CREATE TABLE #TEMP 
(
    ID INT, 
    FIELD1 VARCHAR (5), 
    FIELD2 VARCHAR (5), 
    FIELD3 VARCHAR (5) 
) 

INSERT INTO #TEMP VALUES('555','CVS','E','CIA') 

SELECT 
ID, 
COALESCE(FIELD1 + '_' + FIELD2 + '_' + FIELD3, FIELD2 + '_' + FIELD1) AS STORE 
FROM #TEMP 

Grundsätzlich möchte ich die COALESCE von oben meine Abfrage Case-Anweisung in Oracle ersetzen.

edit: Ich habe diese Field1 ||'_' ||Field2||'_'||Field3 AS Store in Oracle verwendet, aber das Ergebnis gibt mir den zusätzlichen Unterstrich _ von Field3, die ich den Unterstrich nicht sehen möchte.

+1

Oracle coalesce unterstützt - aber es erfordert ** zwei ** Parameter nicht nur einer (und ich glaube, dass dies auch in SQL Server gilt. Nur einen Parameter zu übergeben ist nicht wirklich sinnvoll). Es verwendet jedoch den SQL-Standardoperator '||' zum Verketten von Strings. '+' ist das Hinzufügen von Zahlen –

+0

Ich habe die Verkettung verwendet: Feld1 || '_' || Feld2 || '_' || Feld3 AS Speicher, aber es gibt mir einen zusätzlichen Unterstrich (_), wenn Feld3 keinen Wert hat. Ich möchte die (_) – joe

+0

nicht sehen Wussten Sie wirklich, dass Felder 2 und 1 umgekehrt werden, wenn Feld3 null ist? Oder ist das ein Tippfehler? – kfinity

Antwort

3
COALESCE(FIELD1 || '_' || FIELD2 || '_' || FIELD3, FIELD2 || '_' || FIELD1) 

wird immer nur das erste Glied zurückkehren, da auch wenn alle drei Felder sind NULL der Ausdruck __ bewerten wird, die nicht NULL ist. Dies ist das Äquivalent von:

SELECT TRIM(
     LEADING '_' FROM 
     FIELD1 
     || NLV2(FIELD2, '_' || FIELD2, NULL) 
     || NLV2(FIELD3, '_' || FIELD3, NULL) 
     ) 
FROM DUAL; 

oder

SELECT TRIM(
     LEADING '_' FROM 
     FIELD1 
     || CASE WHEN FIELD2 IS NOT NULL THEN '_' || FIELD2 END 
     || CASE WHEN FIELD3 IS NOT NULL THEN '_' || FIELD3 END 
     ) 
FROM DUAL; 

Wenn Sie Felder 1 & 2 umkehren wollen, wenn Feld 3 ist NULL dann:

SELECT TRIM(
     BOTH '_' FROM 
     CASE 
     WHEN FIELD3 IS NOT NULL 
     THEN FIELD1 
       || CASE WHEN FIELD2 IS NOT NULL THEN '_' || FIELD2 END 
       || '_' || FIELD3 
     ELSE FIELD2 || '_' || FIELD1 
     END 
     ) 
FROM DUAL; 
+0

@joe '+' ist der Operator zum Hinzufügen von Zahlen, '||' ist der Operator zum Verketten von Strings. – MT0

+0

@ MT0, richtig. Ich habe das versehentlich gespeichert. unten war was ich neu gepostet habe. Vielen Dank. – joe