回答

收藏

db2中的Listagg替代品

技术问答 技术问答 135 人阅读 | 0 人回复 | 2023-09-13

我的客户正在使用不带listagg功能的db2数据库,但是我需要以某种方式在一个字段中聚合主键信息。
  ~8 u1 T6 w4 e; D# O8 X7 n7 w现在(对于Oracle),我正在将其用作更大查询的一部分:
; V& x4 \5 T; U: m. B/ uSELECT LISTAGG(COLUMN_NAME || ':' || CONTENT, ',')
/ K4 ^7 z1 F/ g; _' O! iWITHIN GROUP (ORDER BY COLUMN_NAME || ':' || CONTENT)
' v. f) M: X0 \+ p3 f- K, SFROM TABLE9 G: W7 A+ U3 w) d* i4 @
WHERE ROW_IDENTIFIER_ID = I.REC_ID AND I.TABLE_RESULT_ID = T.REC_ID" l% Q! K+ V" }8 u) p% x0 W
从9.7 Fix Pack4版本1开始,还有另一种方法可以在DB2之前的db2数据库中获取listagg函数的结果。# ^) P4 w, n4 `  c7 N; Y
客户数据库的版本:Linux-企业服务器版本9.7,发行号08060107
8 b0 y4 q. _* W4 ^6 Z我通过执行以下选择获得了它:
" P  r( t/ Y/ zSELECT * FROM TABLE(SYSPROC.ENV_GET_INST_INFO()) AS SYSTEMINFO;
* c, G# p! w/ Y+ n& ?  p! W6 LSELECT * FROM TABLE(SYSPROC.ENV_GET_PROD_INFO()) AS SYSTEMINFO;5 V' a* z+ V! N0 p% k5 p
SELECT * FROM TABLE(SYSPROC.ENV_GET_SYS_INFO()) AS SYSTEMINFO;
* `* Q' Q2 h0 _! ^/ |# u  d我承认我不明白,怎么可能是9.7,但是没有listagg函数?:使困惑:1 C7 [  R; A1 J; ~9 @/ t; [+ d+ w3 G9 j1 @
我也执行了:$ D% f4 V2 C. m; P
SELECT * FROM SYSCAT.FUNCTIONS
. u$ e; A3 l2 U( w9 {8 D我返回了此函数列表,但答案中没有其他解决方案中提到的诸如xmltext或xmlgroup之类的函数:(。客户使用的是哪个穴居人数据库?还是我缺少什么?. ?# V6 ?: a% |# {
感谢您的答复。
/ z; E- M# Z4 u1 b$ m               
2 @; p/ S$ A" z5 [! s1 |5 H- u, K解决方案:
- k% u  _! b( n  ]& q1 v               
, N2 I# O% n5 F2 t- I
0 p) q& L- P" ]6 B. }+ J/ ?/ \% g6 {8 M2 k! B$ K# t
                如果您的DB2版本支持pureXML(至少是DB2 for LUW 9.1,并且我相信DB2 9 for z / OS),除了上面建议的@
, U4 x$ `4 r$ B  SPM77-1之外,还可以使用XMLAGG函数:
- R2 G" J" M. s4 }: m" }select xmlserialize(
+ z- A) m( b2 C" u, ^% y/ R  xmlagg(
! }- _% R  }+ r3 G" a) {+ M" s    xmlconcat(
5 p' D! y) _7 {. r7 ^! X! l      xmltext(column_name),
; K/ Q. _4 T$ p6 C      xmltext(':'),9 d( b, s/ N* u! I0 x; d. ~- X6 Q, E
      xmltext(content),
. u7 n1 }; ?/ R0 f9 Z      xmltext(',')
1 ]& Y' s3 R( z. ]3 f    )
; K4 k% ?! T+ G9 v  ) as varchar(10000)
7 A' t  i2 {  m/ A/ l)
" L+ B3 R% }6 S6 a9 @% {from
: d7 q$ S' y* ]# \6 x  yourtable
) y% g, L6 K2 q1 g0 d% x...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则