Выбрать все столбцы в один столбец oracle - PullRequest
1 голос
/ 14 февраля 2020

Как мне получить все столбцы в один столбец?

У меня есть ниже пример запроса

WITH da AS( 
SELECT 'a' col1, 'b' col2, 'c' col3 FROM dual UNION ALL
SELECT '1' col1, '2' col1, '3' col1 FROM dual UNION ALL
SELECT 'x' col1, 'y' col1, 'z' col1 FROM dual
)
SELECT * FROM da;

//RESULTS

COL1|COL2|COL3|
----|----|----|
a   |b   |c   |
1   |2   |3   |
x   |y   |z   |

Но то, что я хочу, это результат, который будет ниже, с | в качестве разделителя.

ONE_COL|
-------|
a|b|c  |
1|2|3  |
x|y|z  |

Моя самая большая проблема - Я не знаю имен столбцов , поэтому я не могу сделать так:

SELECT  col1||'|'||col2||'|'||col3 AS ONE_COL  FROM da;

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

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Это просто демонстрация способа достичь того, о чем вы просили. (Предполагая, что я не понял неправильно то, что вы просили.)

Сначала немного подготовьтесь.

  1. Создайте таблицу DA (в соответствии с данными примера в вашем вопросе).
create table DA (COL1 char(1), COL2 char(1), COL3 char(1));
Добавить строки в таблицу (опять же, в соответствии с примерами данных в вашем вопросе).
insert into DA values ('a','b','c');
insert into DA values ('1','2','3');
insert into DA values ('x','y','z');
Я понимаю, что вы хотите вставить данные из таблицы DA в другую таблицу, поэтому я создал вторую таблицу базы данных в соответствии с тем, что я понял из вашего вопроса.
create table RESULT (ONE_COL char(5));
PL / SQL код, который извлекает имена столбцов (при условии, что вы знаете имя таблицы) из словаря данных, а затем создает динамический c курсор для извлечения значений из этой таблицы (снова в описанном формате в вашем вопросе) и вставляет строки, извлеченные динамическим c курсором, во вторую таблицу базы данных (поскольку это ваше требование, как я понял из вашего вопроса).
declare
  L_COL  varchar2(128);
  L_CUR  sys_refcursor;
  L_ONE  char(5);
  L_SQL  varchar2(2000);
--
  cursor C_COLS is
    select COLUMN_NAME
      from USER_TAB_COLUMNS
     where TABLE_NAME = 'DA';
begin
  L_SQL := 'select ';
  open C_COLS;
  fetch C_COLS into L_COL;
  L_SQL := L_SQL || L_COL;
  while C_COLS%found
  loop
    fetch C_COLS into L_COL;
    if C_COLS%found then
      L_SQL := L_SQL || '||';
      L_SQL := L_SQL || '''|''||';
      L_SQL := L_SQL || L_COL;
    end if;
  end loop;
  close C_COLS;
  L_SQL := L_SQL || ' from DA';
  open L_CUR for L_SQL;
  loop
    fetch L_CUR into L_ONE;
    exit when L_CUR%notfound;
    insert into RESULT values (L_ONE);
  end loop;
  close L_CUR;
end;
Наконец, после запуска вышеуказанного кода PL / SQL ...
select * from RESULT;

, который возвращает

ONE_C
-----
abc
123
xyz
0 голосов
/ 14 февраля 2020

База данных знает имена столбцов. Так что используйте пакет dbms_ sql и проанализируйте ваш sql.

https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_SQL.html#GUID -C96D5BAA-29A9-4AB5-A69E-E31228ECC9E9

Существует множество решений для извлечения данных впоследствии, поэтому я не понимаю, почему вы думаю, что вы не знаете имен столбцов

0 голосов
/ 14 февраля 2020

Объедините двойные столбцы в предложении with, так что вам не нужно знать, как называются столбцы da.

WITH da AS( 
SELECT 'a' || '|' || 'b' || '|' || 'c' AS one_col FROM dual UNION ALL
SELECT '1' || '|' || '2' || '|' || '3' AS one_col FROM dual UNION ALL
SELECT 'x' || '|' || 'y' || '|' || 'z' AS one_col FROM dual
)
SELECT * FROM da;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...