2015-01-09 3 views
1

У меня есть таблица с четырьмя столбцами, которые мне нужны для concat. Два столбца содержат несколько значений NULL.Postgres: Concat несколько столбцов, включая нули

Мне нужно, чтобы результат содержал разделители, указывающие на все четыре столбца, например, так:

colA,colB,colC,colD 

или если один столбец (здесь colB) является ничтожной,

colA,,colC,colD 

я не могу, кажется, найти чистый способ сделать это. Самое лучшее, что я придумал, это:

concat_ws(colA, COALESCE(colB, ''), COALESCE(colC, ''), colD, ',') 

Это кажется громоздким (особенно потому, что мне нужно сделать это неоднократно). Есть ли способ лучше?

+0

Да, но результатом, который я получаю из приведенного выше примера, является: colA, colC, colD. В качестве заполнителя для colB не будет запятой/разделителем. – user1453804

ответ

-2

Я думаю, вы должны использовать курсор, а затем цикл также для того, чтобы показать нулевые значения вы должны использовать функцию NVL(), например:

ПРОЦЕДУРА TODO IS Вокс в VARCHAR2; CURSOR CUR_TEST IN SELECT NVL (colb, 'replace_with'), colA, colD FROM DUAL; Начать для x в цикле CUR_TEST vAux: = x.colb || ',' || x.colA || ',' || x.colD; контур конца;

конец TODO;

Для проверки какой NVL() делает: http://www.techonthenet.com/oracle/functions/nvl.php

+1

Первый курсор - плохой выбор для этой проблемы. Во-вторых, это для Postgres, а не для Oracle –

2

Поскольку окончательное значение не может быть NULL, вам не нужно беспокоиться о сохранении их. Просто используйте пустую строку. Так вы должны писать в стандартном SQL. Функция

select coalesce(cola, '') || ', ' || 
     coalesce(colb, '') || ', ' || 
     coalesce(colc, '') || ', ' || 
     coalesce(cold, '') 
from your_table_name; 

В CONCAT_WS() не пропускает пустые строки, но ли пропускать пустые столбцы. Это означает, что вам все равно придется использовать coalesce().

select concat_ws(', ', coalesce(cola, ''), 
         coalesce(colb, ''), 
         coalesce(colc, ''), 
         coalesce(colb, '')) 
from your_table_name; 
+0

С точки зрения эффективности, это встроенный || лучше, чем функция concat_ws? То, что я надеялся избежать, это писать коалесценцию каждый раз. (ed: правописание) – user1453804

+0

@ MikeSherrill'CatRecall ': Postgres ** имеет ** функцию 'concat_ws()': http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS -STRING-OTHER (и он также пропускает нулевые значения) –

+0

Ha! Откуда это произошло? (Представлено в 9.1.) –

Смежные вопросы