Estoy tratando de devolver una cantidad entera cuando la condición es falsa y una cadena cuando la condición es verdadera.

SELECT 
    ENAME, 
    CASE WHEN COMM IS NULL THEN 'no commission' 
        ELSE COMM
    END AS COMMISSION 
FROM EMP

Estoy recibiendo este error:

ORA-00932: inconsistent datatypes: expected CHAR got NUMBER
1
kestrel 8 sep. 2018 a las 12:56

3 respuestas

La mejor respuesta

Necesita usar CAST:

SELECT ENAME, CASE WHEN COMM IS NULL THEN 'no commission' 
                   ELSE CAST(COMM AS VARCHAR2(20)) END AS COMMISSION 
FROM EMP;

O use COALESCE:

SELECT ENAME, COALESCE(CAST(COMM AS VARCHAR2(20)), 'no commision')
FROM EMP;
4
Lukasz Szozda 8 sep. 2018 a las 09:57

Todos los tipos de datos de todos los casos deben coincidir con la estructura de comparación que utilice, como case..when, decode, nvl o nvl2. Le sugiero que use nvl o nvl2 para su caso, ya que son más directos para casos de valor nulo:

SELECT ENAME, 
       nvl(to_char(COMM),'no commission') AS COMMISSION,
       nvl2(COMM,to_char(COMM),'no commission') AS COMMISSION2     
  FROM EMP;

SQL Fiddle Demo

2
Barbaros Özhan 8 sep. 2018 a las 11:00

Del Referencia del lenguaje Oracle SQL 18c:

Para las expresiones CASE simples y buscadas, todos los return_exprs deben tener el mismo tipo de datos (CHAR, VARCHAR2, NCHAR o NVARCHAR2, NUMBER, BINARY_FLOAT o BINARY_DOUBLE) o todos deben tener un tipo de datos numérico. Si todas las expresiones de retorno tienen un tipo de datos numéricos, Oracle determina el argumento con la mayor prioridad numérica, convierte implícitamente los argumentos restantes a ese tipo de datos y devuelve ese tipo de datos.

El tipo de datos del literal de cadena 'sin comisión' es VARCHAR2 y la columna COMM parece ser un tipo de datos numéricos, por lo que se genera un error.

Puede convertir el valor de retorno COMM en la cláusula else a VARCHAR2, para evitar este error. Creo que la mejor manera de hacerlo es usar el función TO_CHAR porque esto le permite controlar el formato de los números que se muestran.

3
miracle173 8 sep. 2018 a las 11:58