Oracle SQL:输出文本文件中的强制回车/换行
我是新来的Oracle SQL,希望这里的人能帮我解决这个问题 我有一个Select语句,它使用Listagg组合多个列/值。 SQL作业的输出是一个文本文件,然后手动将其导入Excel 我的查询本身可以工作,但我希望在生成的文本文件中强制使用一些回车/新行,以便不是我的Listagg中的所有数据都显示在一行中 我在聚合的列之间尝试了Oracle SQL:输出文本文件中的强制回车/换行,sql,oracle,text,newline,carriage-return,Sql,Oracle,Text,Newline,Carriage Return,我是新来的Oracle SQL,希望这里的人能帮我解决这个问题 我有一个Select语句,它使用Listagg组合多个列/值。 SQL作业的输出是一个文本文件,然后手动将其导入Excel 我的查询本身可以工作,但我希望在生成的文本文件中强制使用一些回车/新行,以便不是我的Listagg中的所有数据都显示在一行中 我在聚合的列之间尝试了| | | | chr(10)列名:'| |和| | |字符(10)列名:'| |,但在导入文本文件时,Excel不会将其识别为新行(在同一单元格中),而是将其显示
| | | | chr(10)列名:'| |
和| | |
字符(10)列名:'| |,但在导入文本文件时,Excel不会将其识别为新行(在同一单元格中),而是将其显示为文本,并将其全部显示在同一行中
有人能告诉我怎样才能做到这一点吗
更新
Item No.: 123 chr(10)Article: Item A chr(10)Quantity: 10 ...
Item No.: 123
Article: Item A
Quantity: 10
...
我的查询(第一部分):
SELECT
a.SHIPPER_ID
, LISTAGG
(
'Item No.: ' || ducsi.ITEM_NUMBER ||
' chr(10)Article: ' || c.ARTICLE ||
' chr(10)Quantity: ' || b.QUANTITY ||
' chr(10)chr(10)'
) WITHIN GROUP (ORDER BY b.SHIPMENT_ID)
/* ... */
电流输出:
Item No.: 123 chr(10)Article: Item A chr(10)Quantity: 10 ...
Item No.: 123
Article: Item A
Quantity: 10
...
预期输出:
Item No.: 123 chr(10)Article: Item A chr(10)Quantity: 10 ...
Item No.: 123
Article: Item A
Quantity: 10
...
多谢各位,
Mike之所以将
chr(10)
作为文本,是因为您将其包含在文本字符串中。您必须将其连接到文本字符串中,例如,“一些文本”| | chr(10)| |“更多文本”
然而,我认为Listag并不是您真正应该在这里使用的,特别是因为在结果字符串中可以输出的量是有限制的
相反,我认为你是在追求一个,比如:
WITH sample_data AS (SELECT 1 shipper_id, 10 item_number, 'abc' article, 100 quantity FROM dual UNION ALL
SELECT 2 shipper_id, 20 item_number, 'efg' article, 200 quantity FROM dual UNION ALL
SELECT 3 shipper_id, 30 item_number, 'hij' article, 300 quantity FROM dual)
-- end of mimicking a table called sample_data with data in it
-- see SQL below:
SELECT CASE WHEN row_number() OVER (PARTITION BY shid
ORDER BY CASE WHEN column_name = 'Item No.:' THEN 1
WHEN column_name = 'Article:' THEN 2
WHEN column_name = 'Quantity:' THEN 3
ELSE 4
END) = 1
THEN shid
END shipper_id,
column_name||' '||vals results
FROM (SELECT shipper_id shid,
to_char(item_number) "Item No.:",
article "Article:",
to_char(quantity) "Quantity:"
FROM sample_data)
UNPIVOT (vals FOR column_name IN ("Item No.:", "Article:", "Quantity:"))
ORDER BY shid,
CASE WHEN column_name = 'Item No.:' THEN 1
WHEN column_name = 'Article:' THEN 2
WHEN column_name = 'Quantity:' THEN 3
ELSE 4
END;
SHIPPER_ID RESULTS
---------- --------------------------------------------------
1 Item No.: 10
Article: abc
Quantity: 100
2 Item No.: 20
Article: efg
Quantity: 200
3 Item No.: 30
Article: hij
Quantity: 300
此处使用row_number()分析函数来确保仅为第一行显示发货人id
case when column\u name=…
case表达式用于确保列以正确的顺序(项目编号、物品和数量)输出(在row\u number()分析函数中以及在总体结果中)
ETA:如果每个发货人id可以有多个item_编号,则需要对上述查询进行一些调整:
WITH sample_data AS (SELECT 1 shipper_id, 10 item_number, 'abc' article, 100 quantity FROM dual UNION ALL
SELECT 1 shipper_id, 11 item_number, 'xyz' article, 110 quantity FROM dual UNION ALL
SELECT 2 shipper_id, 20 item_number, 'efg' article, 200 quantity FROM dual UNION ALL
SELECT 3 shipper_id, 30 item_number, 'hij' article, 300 quantity FROM dual)
-- end of mimicking a table called sample_data with data in it
-- see SQL below:
SELECT CASE WHEN row_number() OVER (PARTITION BY shid ORDER BY CASE WHEN column_name = 'Item No.:' THEN 1 WHEN column_name = 'Article:' THEN 2 WHEN column_name = 'Quantity:' THEN 3 ELSE 4 END) = 1
THEN shid
END shipper_id,
column_name||' '||vals results
FROM (SELECT shipper_id shid,
item_number,
to_char(item_number) "Item No.:",
article "Article:",
to_char(quantity) "Quantity:"
FROM sample_data)
UNPIVOT (vals FOR column_name IN ("Item No.:", "Article:", "Quantity:"))
ORDER BY shid,
item_number,
CASE WHEN column_name = 'Item No.:' THEN 1 WHEN column_name = 'Article:' THEN 2 WHEN column_name = 'Quantity:' THEN 3 ELSE 4 END;
SHIPPER_ID RESULTS
---------- --------------------------------------------------
1 Item No.: 10
Article: abc
Quantity: 100
Item No.: 11
Article: xyz
Quantity: 110
2 Item No.: 20
Article: efg
Quantity: 200
3 Item No.: 30
Article: hij
Quantity: 300
请看@Slkrasnodar:谢谢,我以前在这一页上,但我没有看到解决方案。我也试过chr(13),但也不起作用。试一下“xxx”| | chr(13)| | chr(10)| | col..”@keewee279您是说您正在连接多个列(例如“listagg(col1 | | |’、| | col2 | | |’、| | | | col3,…”),并且希望将列结果拆分为单独的行(例如
'col1 | u val,col2 | val'| chr(10)| | | col3 | u val…
)?如果是这样,可能Listag不是您所需要的。如果您使用一些示例数据以及预期的输出更新了您的问题,我们可以为您提供最好的帮助。当然,如果您只想在自己的行中获取每组列,那么您需要将分隔符设置为chr(10)
@Boneist:谢谢。我刚刚添加了我的查询以及当前和预期的输出。查询本身是有效的,唯一的问题是它显示了chr(10)作为输出中的文本,而不是显示新行。因此,当我在Excel中导入它时,我的所有文本都显示在一行中,而不是手动添加换行符。非常感谢这一点-太棒了!是的,每个ID可以有多个项目编号-这就是为什么我的Listagg以2 chr(10)结尾的原因因为我的想法是用一个空行将它们分开。我将测试这两种方法,稍后再回来。