在我的Web应用程序中,我有一个输入字段,可以容纳一个大字符串。在保存记录之前,它会分为80个字符长的记录。在ireport中,我需要将每个记录的字符串显示为一个字符串。
答案 0 :(得分:1)
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)会更容易。