如何使多记录文件显示为一个记录

时间:2019-01-29 21:50:38

标签: sql db2

在我的Web应用程序中,我有一个输入字段,可以容纳一个大字符串。在保存记录之前,它会分为80个字符长的记录。在ireport中,我需要将每个记录的字符串显示为一个字符串。

2 个答案:

答案 0 :(得分:1)

了解LISTAGG aggregate function

with t (str) as (values 
  '1-st string'
, '2-nd string'
, '3-rd string'
)
select listagg(str) final_string
from t;

结果是:

FINAL_STRING
---------------------------------
1-st string2-nd string3-rd string

如果需要,可以在第二个函数参数中使用一些自定义分隔符。

答案 1 :(得分:0)

我可以考虑两种方法:一种是静态方法,另一种是递归方法:

让我们假设您的message表具有三列message_id,sequence和message_line,其中message_id唯一标识空洞消息,而sequence枚举了消息行。

如果您对前n行感兴趣,可以使用静态查询,例如

SELECT 
    A.MESSAGE_ID, A.MESSAGE_LINE || ' ' || 
    COALESCE(B.MESSAGE_LINE, '') || ' ' || 
    COALESCE(C.MESSAGE_LINE, '') || ' ' || 
    COALESCE(D.MESSAGE_LINE, '')
FROM
    MESSAGES A
LEFT JOIN MESSAGES B ON A.MESSAGE_ID = B.MESSAGE_ID AND A.SEQUENCE+1 = B.SEQUENCE
LEFT JOIN MESSAGES C ON B.MESSAGE_ID = C.MESSAGE_ID AND B.SEQUENCE+1 = C.SEQUENCE
LEFT JOIN MESSAGES D ON C.MESSAGE_ID = D.MESSAGE_ID AND C.SEQUENCE+1 = D.SEQUENCE
WHERE A.SEQUENCE = 1;

如果需要所有行,则可以使用更复杂的递归查询,例如:

WITH AA (MESSAGE_ID, SEQUENCE, MESSAGE_LINE) AS (
SELECT
    MESSAGE_ID,
    SEQUENCE,
    CAST(MESSAGE_LINE AS VARCHAR(1000))
FROM
    MESSAGES
WHERE 
    SEQUENCE = 1
UNION ALL
SELECT 
    B.MESSAGE_ID,
    B.SEQUENCE,
    CAST((AA.MESSAGE_LINE || ' ' || B.MESSAGE_LINE) AS VARCHAR(1000))
FROM
    MESSAGES B, 
    AA
WHERE
    B.MESSAGE_ID = AA.MESSAGE_ID
AND B.SEQUENCE = AA.SEQUENCE  + 1
)
SELECT AA.MESSAGE_ID, AA.MESSAGE_LINE 
FROM AA, (SELECT MESSAGE_ID, MAX(SEQUENCE) AS SEQUENCE 
          FROM MESSAGES 
          GROUP BY MESSAGE_ID) BB
WHERE AA.MESSAGE_ID = BB.MESSAGE_ID
AND AA.SEQUENCE = BB.SEQUENCE;

提示:

(1)UNION ALL之前的第一个查询是非递归部分,即引发查询的火花。 UNION ALL之后的部分是递归部分。

(2)CAST(...)用于将CHAR(80)转换为更大的列,该列的大小足以分配空洞消息。

小心性能。调整递归查询可能很困难,在某些情况下,开发常规的存储过程或用户定义的表函数(UDTF)会更容易。