具有不同数量输出列的Oracle SQL标头和详细信息

时间:2018-11-08 09:39:25

标签: sql oracle header

我需要使用ORACLE sql以以下格式输出文件

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

我创建了以下代码。几乎可以使用,但是问题是Trailer记录只有两个字段。为了使工会工作,我在field3中添加了null。但, 这意味着导出时输出看起来像这样。标头和明细有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 :(得分:0)

我不明白这个问题。您的示例结果只有一列,但是结果集有三列。您的查询也很难遵循(我必须水平和垂直滚动)。

如果要删除Oracle查询中的最后一个逗号,请使用trim()

trim(trailing ',' from xxx)

答案 1 :(得分:0)

听起来您的问题与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均为空的情况。