У меня есть такой sql:

 SELECT temp.inst_id,
       ' ',
       gv.instance_name,
       gv.host_name,
       CASE WHEN component IS NULL THEN 'others' ELSE component END
          component,
       ROUND (SUM (used_mb), 1) used_mb
  FROM (SELECT inst_id,
               CASE
                  WHEN name = 'buffer_cache' THEN 'db_buffer_cache'
                  WHEN name = 'log_buffer' THEN 'log_buffer'
                  ELSE pool
               END
                  component,
               CASE
                  WHEN name = 'buffer_cache'
                  THEN
                     (  (  (  bytes
                            -   (SELECT COUNT (*)
                                   FROM gv$bh
                                  WHERE     inst_id = x.inst_id
                                        AND status = 'free')
                              * (SELECT t.VALUE
                                   FROM gv$parameter t
                                  WHERE     t.inst_id = x.inst_id
                                        AND t.name = 'db_block_size'))
                         / 1024)
                      / 1024)
                  WHEN name != 'free memory'
                  THEN
                     ( (bytes / 1024) / 1024)
               END
                  used_mb
          FROM gv$sgastat x) temp,
       gv$instance gv
 WHERE gv.inst_id = temp.inst_id
GROUP BY component,
       temp.inst_id,
       gv.instance_name,
       gv.host_name

Вот результат этого запроса:

1   irisdb1 db_buffer_cache     27,6    27,5
1   irisdb1 java pool            0,2    
1   irisdb1 large pool           0,2     0,1
1   irisdb1 log_buffer           0,2     0,2
1   irisdb1 shared pool          3,7       3
1   irisdb1 others                 0       0
2   irisdb2 db_buffer_cache     27,6    27,4
2   irisdb2 java pool            0,1    
2   irisdb2 large pool           0,4     0,2
2   irisdb2 log_buffer           0,2     0,2
2   irisdb2 shared pool            4     3,4
2   irisdb2 others                 0       0

Как вы можете видеть в выходных данных, некоторые строки (2-я и 8-я строки) имеют пустое значение в последнем столбце. Я хочу присвоить этим пустым значениям 0 (двойное значение).

0
AloneInTheDark 11 Мар 2014 в 18:27

3 ответа

Лучший ответ

Если значение равно NULL, то вы можете использовать coalesce() (или несколько других функций) `, чтобы ввести значение:

 SELECT temp.inst_id,
       ' ',
       gv.instance_name,
       gv.host_name,
       CASE WHEN component IS NULL THEN 'others' ELSE component END
          component,
       COALESE( ROUND (SUM (used_mb), 1), 0.0) used_mb
3
Gordon Linoff 11 Мар 2014 в 18:47
Одной из функций является NVL, я могу использовать ее как NVL(used_mb,0). Спасибо за ответ.
 – 
AloneInTheDark
11 Мар 2014 в 18:52

Вам просто нужно указать значение по умолчанию, если оно равно NULL:

COALESCE(ROUND (SUM (used_mb), 1),0.0) used_mb
1
Evan L 11 Мар 2014 в 18:54
T-SQL поддерживает ISNULL, но Oracle использует COALESCE (на самом деле).
 – 
MatBailie
11 Мар 2014 в 18:50
Упс, проигнорировал тег Oracle, изменив ответ.
 – 
Evan L
11 Мар 2014 в 18:54

Добавьте предложение ELSE в оператор CASE для used_mb

           CASE
              WHEN name = 'buffer_cache'
              THEN
                 (  (  (  bytes
                        -   (SELECT COUNT (*)
                               FROM gv$bh
                              WHERE     inst_id = x.inst_id
                                    AND status = 'free')
                          * (SELECT t.VALUE
                               FROM gv$parameter t
                              WHERE     t.inst_id = x.inst_id
                                    AND t.name = 'db_block_size'))
                     / 1024)
                  / 1024)
              WHEN name != 'free memory'
              THEN
                 ( (bytes / 1024) / 1024)
              ELSE 0
           END
              used_mb
0
Barmar 11 Мар 2014 в 18:46