我需要使用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文件。所以我以后不能编辑文件。
答案 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均为空的情况。