2012-03-15 11 views
6

Tengo la siguiente consulta. Cuando type_id is null quiero que se agrupe por el nombre "desconocido".
¿Cómo puedo hacerlo?
Sé que hay una función de decodificación pero no estoy seguro de cómo usarla.Valores nulos de decodificación de SQL

select type_id, 
     name 
    from test_table 
group by decode(type_id,'Unknown'), 
      name; 

¿cómo puedo hacerlo?

+0

IFNULL(), COALESC() – wildplasser

+0

DECODE es decodificar (columna, potentialvalue, resultado, 2ndpotentialvalue, resultado, ... NpotentialValue, resultado, elsevalue) declaraciones de casos son un poco más fácil para leer, así lo prefieren algunos. Solo FYI: un GRAN recurso para definiciones rápidas de funciones es TechOnTheNet. http://www.techonthenet.com/oracle/functions/decode.php Usted puede googlear fácilmente "Decodificación de Oracle" y lo lleva directamente a la página vinculada más arriba. Guarda la publicación y espera una respuesta. – user158017

Respuesta

11
select decode(type_id, null, 'Unknown', type_id), name, count(*) 
from 
(
    select 'asdf' type_id, 'name1' name from dual union all 
    select 'asdf' type_id, 'name2' name from dual union all 
    select null type_id, 'name3' name from dual 
) test_table 
group by type_id,name; 

Estoy de acuerdo con @sql_mommy que CASE probablemente se vea mejor. Pero no estoy de acuerdo con usar TechOnTheNet como su principal fuente de información. Por lo general, es mejor con la documentación oficial, y el page for DECODE es un buen ejemplo de por qué.

DECODE tiene un comportamiento extraño: "En una función DECODE, Oracle considera que dos nulos son equivalentes". Ese comportamiento no se menciona en el artículo de TechOnTheNet.

+1

+1 para promocionar la documentación de Oracle a través de TechOnTheNet. TOTN puede facilitar la comprensión de ciertas características, pero a veces puede pasar por alto información importante. – Ollie

+0

Muchas gracias por la información – Arav

9

Para null, tenemos la función NVL. Puede ser utilizado de la siguiente manera

select nvl(type_id,'Unknown'),name from test_table group by 
type_id,name; 
3

Usted puede utilizar el NVL función o COALESCE:

select NVL(type_id, 'Unknown') AS type_id, 
     name 
    from test_table 
group by NVL(type_id, 'Unknown'), 
      name; 

O

select COALESCE(type_id, 'Unknown') AS type_id, 
     name 
    from test_table 
group by COALESCE(type_id, 'Unknown'), 
      name; 

COALESCE es más eficiente que NVL ya que sólo se evalúa el segundo argumento si el primero es NULL, mientras que NVL evalúa ambos argumentos todo el tiempo.

creo que sirve ...

Cuestiones relacionadas