Oracle SQL Header и детализация с разным количеством выходных столбцов - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужно вывести файл с использованием ORACLE sql в следующем формате

HEADR,xx,20170130145001
DTROW,1357924680135,9876543210
DTROW,2468013579246,1234567890
TRAIL,3

Я создал следующий код. Что почти работает, но проблема в том, что запись трейлера имеет только два поля. Чтобы заставить работать профсоюз, я добавил null в field3. Но, это означает, что при экспорте вывод выглядит так. Заголовок и деталь имеют 3 поля, трейлер имеет только 2.

При выполнении запроса получим следующее

FIELD1  FIELD2         FIELD3 
HEADR   XX             20181108145437
DTROW   1357924680135  9876543210
DTROW   2468013579246  1234567890
TRAIL   3              null 

При экспорте в CSV-файл получите следующее

HEADR,XX,20181108092508
DTROW,1357924680135,9876543210
DTROW,2468013579246,1234567890
TRAIL,3,      <<===== I don't want to have , after 2

Это код, который я использовал:

WITH     main_query     AS
(
     SELECT 'DTROW'                               AS field1
     ,       ACCT                                 AS field2
     ,       ID                                   AS field3
     ,       ROW_NUMBER () OVER (ORDER BY ACCT)   AS r_num
     FROM       MYTABLE 
)
,     union_data     AS
(
     -- Header line
         SELECT  'HEADR'                                AS field1
     ,           'XX'                                   AS field2
     ,           TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS')   AS field3
     ,           0                                      AS r_num
     FROM     dual
           --
     UNION ALL
            --
     -- Main query
     SELECT     *
     FROM     main_query
          --
     UNION ALL
            --
     -- Trailer line

     SELECT 'TRAIL'                   AS field1
     ,       TO_CHAR(COUNT(*) + 1 )   AS field2
     ,       NULL                     AS field3
     ,       NULL                     AS r_num
     FROM     main_query
)
SELECT       field1
,            field2
,            field3
FROM       union_data
ORDER BY  r_num          NULLS LAST
;

Как мне обойти эту проблему. Экспортированный CSV-файл будет иметь в конце записи трейлера, потому что поле 3 пустое.

Мне не нужна запятая, поскольку запись в трейлере должна содержать только 2 поля. Поэтому при экспорте в csv должен выглядеть следующим образом.

 TRAIL,3

не так

 TRAIL,3,

SQL-код будет запущен в Bi Publisher и выведет CSV-файл. Поэтому я не могу потом редактировать файл.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Похоже, ваша проблема не имеет ничего общего с SQL.Ваш запрос возвращает три столбца, а BI Publisher преобразует их в CSV, и эта "запятая" происходит из-за значения NULL в третьем столбце.Если у BI Publisher нет способа предотвратить это (и я сомневаюсь, что это так, потому что это полностью испортило бы CSV), единственное, о чем я могу думать, - это построить CSV как один столбец самостоятельно:

[...]
SELECT field1 || ',' || field2 ||
       CASE WHEN field3 IS NOT NULL THEN
           ',' || TO_CHAR( field3 ) END NULL END AS all_fields
  FROM union_data
ORDER BY r_num NULLS LAST

Это игнорирует случай, когда field2 и field3 равны нулю.

0 голосов
/ 08 ноября 2018

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

Если вы хотите удалить запятую в запросе Oracle, используйте trim():

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