Oracle SQL:输出文本文件中的强制回车/换行

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不会将其识别为新行(在同一单元格中),而是将其显示

我是新来的Oracle SQL,希望这里的人能帮我解决这个问题

我有一个Select语句,它使用Listagg组合多个列/值。 SQL作业的输出是一个文本文件,然后手动将其导入Excel

我的查询本身可以工作,但我希望在生成的文本文件中强制使用一些回车/新行,以便不是我的Listagg中的所有数据都显示在一行中

我在聚合的列之间尝试了
| | | | 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)结尾的原因因为我的想法是用一个空行将它们分开。我将测试这两种方法,稍后再回来。