回答

收藏

db2中的Listagg替代品

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

我的客户正在使用不带listagg功能的db2数据库,但是我需要以某种方式在一个字段中聚合主键信息。
; w1 ~; ~8 z8 X) L/ N现在(对于Oracle),我正在将其用作更大查询的一部分:
. |$ J  ?# n7 @- j* c% ~SELECT LISTAGG(COLUMN_NAME || ':' || CONTENT, ',')
# b4 r$ h) q9 y2 E" s( L2 DWITHIN GROUP (ORDER BY COLUMN_NAME || ':' || CONTENT) : ?; l4 k# _0 H: v" R4 i( n
FROM TABLE: Z. d& g# g# ?' l6 z/ p) {
WHERE ROW_IDENTIFIER_ID = I.REC_ID AND I.TABLE_RESULT_ID = T.REC_ID! Z8 ]2 }( x( X: j* D2 A: z
从9.7 Fix Pack4版本1开始,还有另一种方法可以在DB2之前的db2数据库中获取listagg函数的结果。+ W$ [/ D  ?- M8 f7 w/ m
客户数据库的版本:Linux-企业服务器版本9.7,发行号08060107
5 q' t. b- O7 [9 G. [1 a我通过执行以下选择获得了它:
2 K& T" e9 `2 p  M! {. qSELECT * FROM TABLE(SYSPROC.ENV_GET_INST_INFO()) AS SYSTEMINFO;
) E. Q8 y3 S- o. H) nSELECT * FROM TABLE(SYSPROC.ENV_GET_PROD_INFO()) AS SYSTEMINFO;
9 c/ M- e0 q, ?+ j* N4 [) l2 d& PSELECT * FROM TABLE(SYSPROC.ENV_GET_SYS_INFO()) AS SYSTEMINFO;
0 S' ]. J9 g: f( G我承认我不明白,怎么可能是9.7,但是没有listagg函数?:使困惑:
3 @5 ]3 {- t/ x, x3 b我也执行了:
# K, ?; |, f7 d/ J3 ISELECT * FROM SYSCAT.FUNCTIONS
/ u. R( ^# t: R8 e+ \. [2 A我返回了此函数列表,但答案中没有其他解决方案中提到的诸如xmltext或xmlgroup之类的函数:(。客户使用的是哪个穴居人数据库?还是我缺少什么?
$ `8 _" N( x5 _感谢您的答复。9 R; n9 V- J- n! i
                8 t$ i1 i' l$ A( S) q& T
解决方案:7 y8 ]+ y* q9 t! F$ e) s, L
               
/ {" ]$ e; q* r# k* H$ x6 I% m( n
; |3 ~3 I( u  Z, g! ~: C
1 `  T* n2 z0 D8 o* Z                如果您的DB2版本支持pureXML(至少是DB2 for LUW 9.1,并且我相信DB2 9 for z / OS),除了上面建议的@
8 z" L6 o5 P! NPM77-1之外,还可以使用XMLAGG函数:8 x0 Q$ T* f. R: F  x
select xmlserialize(9 j3 g6 y  m2 \, h* u& F+ h1 C: d
  xmlagg(
6 D" D' h, }) A4 T# f+ k6 v    xmlconcat(! I" Q8 j+ ~5 n$ Q2 ?, K' b
      xmltext(column_name),
5 L0 f0 m, i8 s% ^4 h      xmltext(':'),) f4 c! o. G+ X' _6 |
      xmltext(content),
4 ~# m: l. Z" ~9 f0 F      xmltext(',')7 \, O0 D3 f' G+ Y3 k, ~
    )
$ _. p; n) t! d& q: m  ) as varchar(10000)
& }/ O7 R1 S# k' y) u+ _)
" F  G& U& B: z1 J6 U9 Ifrom
* W# G9 ~; q) j" ]  yourtable
6 l8 f! J, K/ W" ~: g9 J/ m/ J% F...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则