Пустые значения декодирования SQL - PullRequest
8 голосов
/ 15 марта 2012

У меня есть запрос ниже. Когда type_id is null я хочу, чтобы он был сгруппирован по имени «неизвестно».
Как я могу это сделать.
Я знаю, что есть функция декодирования, но я не уверен, как ее использовать.

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

как я могу это сделать?

Ответы [ 3 ]

13 голосов
/ 15 марта 2012
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;

Я согласен с @sql_mommy, что CASE, вероятно, будет выглядеть лучше.Но я не согласен с использованием TechOnTheNet в качестве основного источника информации.Обычно вам лучше с официальной документацией, и страница для DECODE является хорошим примером того, почему.

DECODE ведет себя странно: «В функции DECODE Oracle считает, чтодва нуля, чтобы быть эквивалентными. "Такое поведение не упоминается в статье TechOnTheNet.

9 голосов
/ 15 марта 2012

Для нуля у нас есть функция NVL. Может использоваться следующим образом

select nvl(type_id,'Unknown'),name from test_table group by
type_id,name;
3 голосов
/ 15 марта 2012

Вы можете использовать либо функцию NVL, либо COALESCE:

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

Или

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

COALESCE более эффективен, чем NVL, поскольку он оценивает второй аргумент, только если первый равен NULL, тогда как NVL оценивает оба аргумента каждый раз.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...