Как получить нечетные столбцы в oracle - PullRequest
1 голос
/ 19 февраля 2020

Как получить нечетные столбцы в Oracle, используя запрос, когда число столбцов и имя столбцов неизвестны? Например: мне нужно получить вывод в формате ниже

Столбец1 столбец3 столбец5 столбец7 И так далее ...

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это не может быть сделано просто, но это возможно, используя словарь данных Oracle и некоторые динамические значения c SQL.

Чтобы узнать столбцы с нечетными номерами, вам нужно взглянуть на ALL_TAB_COLUMNS просмотр. Столбец COLUMN_ID упорядочивает столбцы 1,2,3. Таким образом, вы найдете все нечетные столбцы в таблице SCOTT.EMP:

select column_name, column_id
from all_tab_columns
where owner = 'SCOTT'
and table_name = 'EMP'
and mod(column_id,2) = 1
order by column_id;

Это вернет что-то вроде:

COLUMN_NAME  COLUMN_ID
-----------  ---------
EMPNO                1
JOB                  3
HIREDATE             5
COMM                 7

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

select listagg(column_name,',') within group (order by column_id) as result
from user_tab_columns
where table_name = 'EMP'
and mod(column_id,2) = 1;

RESULT
------
EMPNO,JOB,HIREDATE,COMM

Теперь мы можем добавить к этому SQL, чтобы сгенерировать нужный оператор выбора:

select 'select ' || listagg(column_name,',') within group (order by column_id) || ' from ' || table_name as sql
from user_tab_columns
where table_name = 'EMP'
and mod(column_id,2) = 1
group by table_name;

SQL
---
select EMPNO,JOB,HIREDATE,COMM from EMP

(Обратите внимание, мне пришлось добавить group by, потому что table_name не агрегируется LISTAGG).

Вы можете использовать SQL в некотором коде PL / SQL для заполнения переменной v_sql, а затем использовать СУБД_ SQL пакет для ее запуска. Но это сложный топи c сам по себе, и я не буду go в него здесь.

1 голос
/ 19 февраля 2020

Вам необходимо использовать динамические c запросы в следующей процедуре:

SQL> CREATE OR REPLACE PROCEDURE ODD_COLUMNS (
  2      TABLE_NAME_P   IN             VARCHAR2,
  3      DATAA          OUT            SYS_REFCURSOR
  4  ) AS
  5      V_SQL   VARCHAR2(4000);
  6  BEGIN
  7      SELECT
  8          'SELECT '
  9          ||
 10              LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(
 11                  ORDER BY
 12                      COLUMN_ID
 13              )
 14          || ' FROM "'
 15          || TABLE_NAME_P
 16          || '"'
 17      INTO V_SQL
 18      FROM
 19          USER_TAB_COLS
 20      WHERE
 21          TABLE_NAME = TABLE_NAME_P
 22          AND MOD(COLUMN_ID, 2) = 1;
 23
 24      OPEN DATAA FOR V_SQL;
 25
 26  END ODD_COLUMNS;
 27  /

Procedure created.

SQL>

Теперь давайте проверим это:

SQL> variable rc refcursor;
SQL> exec ODD_COLUMNS('EMP',:rc);

PL/SQL procedure successfully completed.

SQL> print rc;

    EMP_ID E
---------- -
        10 N
        20 Y

SQL>
SQL> exec ODD_COLUMNS('MY_TABLE1',:rc);

PL/SQL procedure successfully completed.

SQL> print rc;

        ID    REQ_QTY
---------- ----------
      1001         10
      1001         20
      1001         30
      1002         40
      1003         10
      1003         20

6 rows selected.

SQL>

ура !!

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