2016-12-13 1 views
4

Ich schreibe eine CASE-Anweisung in ORACLE über TOAD, die den tatsächlichen Wert zurückgibt, wenn es bestimmte Bedingungen erfüllt, andernfalls gibt eine neue Zeichenfolge zurück.Fallanweisung in Oracle mit einer Bedingung, die die tatsächliche Spalte zurückgibt

Die folgenden Werke,

SELECT (CASE WHEN COLUMN_NAME = 'SOMETEXT' THEN 'SOMEOTHERTEXT' ELSE 'DIFFERENTTEXT' END) NEWCOLUMNNAME 
FROM TABLENAME 

Die folgende nicht funktioniert,

SELECT (CASE WHEN COLUMN_NAME = 'SOMETEXT' THEN 'SOMEOTHERTEXT' ELSE COLUMN_NAME END) NEWCOLUMNNAME 
FROM TABLENAME 

ich folgende Fehlermeldung erhalten -

ORA-12704: Zeichensatz Mismatch

Beliebig Hilfe?

+1

was ist der Datentyp von 'column_name'? –

+0

vkp - Es ist NVARCHAR2 – tempidope

+0

irgendein spezieller Zeichensatz? Arabisch? Chiness? –

Antwort

5

Mischung von Varchar und Nvarchar am Ergebnistyp.
Der Standardtyp für Ihre String-Literale ist Varchar und Ihre Spalte hat den Nvarchar-Typ.

Setzen Sie N vor den String-Literalen, um sie als nvarchar zu definieren.

https://docs.oracle.com/cd/E18283_01/server.112/e17118/sql_elements003.htm#i42617


create table TABLENAME (COLUMN_NAME nvarchar2(100)); 
insert into TABLENAME (COLUMN_NAME) values ('ABC'); 


select case 
      when column_name = 'SOMETEXT' 
      then 'SOMEOTHERTEXT' 
      else column_name 
     end      as newcolumnname 

from tablename 
; 

ORA-12704: Zeichensatz Mismatch

(Die 1. N ist implizit Guss für den Vergleich zu verhindern, verhindert die 2. N der Fehler - Alle Ergebnisausdrücke der Case-Anweisung müssen vom selben Typ sein.)

select case 
      when column_name = N'SOMETEXT' 
      then N'SOMEOTHERTEXT' 
      else column_name 
     end      as newcolumnname 

from tablename 
; 

NEWCOLUMNNAME 
------------- 
ABC 
+0

@vkp, Sie sind völlig richtig :-) - Danke –

+0

Bitte überprüfen Sie .... –

+0

ich upvoted, sobald ich die Bearbeitung sah. –

Verwandte Themen