回答

收藏

更改Oracle 11gR2的WM_CONCAT函数的分隔符

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

通常,WM_CONCAT是一个聚合函数,它从表中返回用逗号分隔的值,如下所示。
; K4 b# d) J" B/ @0 b  S假设我有一个foo像这样的表:) q5 k! y( @% U2 ~( n5 O2 f! U: o4 y
col_id     | col_text$ q6 y9 F  [- K$ q; Z5 @

& \2 m+ E% ~) g" b0 ]111        | This7 e, z# D- |7 W& A0 d
111        | is
; \' g" x8 @$ b6 |/ N111        | a
, y8 p, j1 O# Q* J, g1 d" h111        | test.
7 W5 K# C2 r6 g* f" Q% @& G: }* j6 ]如果我使用此查询:6 v$ n9 Q8 C5 V4 g& z
SELECT CAST(WM_CONCAT(col_text) AS VARCHAR2(100)), col_id FROM foo0 P3 [; ]) A$ K) u0 w: d! v9 s- k
结果将是0 F  Y4 q" w# Z$ C/ K& k* T6 E
This, is, a, test.+ @7 P& @$ D" P0 g
是否有可能改变分离器(',')到其他字符,如'.'或'|'的的WM_CONCAT()功能?& n& E* }* t+ y+ {
还是创建一个可以像这样执行的用户定义函数WM_CONCAT()?# o4 g, t; j, M0 Y
               
; {; T1 k+ @& z1 F6 R解决方案:4 q. ~; w/ g5 A7 w/ U
               
7 H; A. X* v: o' K* s. H3 p3 y3 x2 Q1 Y( w8 r( c8 S4 L2 L- j
$ W$ p0 ~! b  s& c, p+ m2 O2 G, n
                您可能要使用
1 T4 X+ i1 F8 ^0 p0 R/ DLISTAGG。
  \( [% m$ q& mSELECT col_id, : r) W% y2 N; L8 p# J. {# m
       LISTAGG(col_text, '|') WITHIN GROUP (ORDER BY col_text) text0 t8 F, h4 y% x
  FROM table1
7 Z3 ?4 k, t# W- l6 p GROUP BY col_id8 x2 T$ Z- @9 K$ A3 l2 q
输出:
$ W! J' G8 s2 z9 Z! U: B, L3 t| COL_ID |            TEXT |# I0 K+ b% v1 O& C) c
----------------------------
" k4 h. j% P0 c6 Q( Q4 ^5 b|    111 | This|a|is|test. |( i2 C; a) d8 ~& Y
SQLFiddle
4 Z- k0 s3 H9 U# T) ]更新 如果您需要在列表中获取不同的文本值
5 L3 l. }, z# b8 s! G( ]SELECT col_id,
6 O. M9 l# S, ^6 E8 b       LISTAGG(col_text, '|')
, W' E0 F& M( n, V         WITHIN GROUP (ORDER BY col_text) text: g) J- g/ Q' G. @  a1 {' `: q
  FROM
0 \8 W2 ]) g9 Z# |( J3 h(2 W0 f8 r+ Q8 W1 Q% D" p
  SELECT DISTINCT col_id, col_text7 |" Y) V7 f9 `& t* s& z* D* H
    FROM table1# Z( |" j$ l. |& T& ?' _: \
)8 L! V  ^% F2 O8 E% s
GROUP BY col_id
2 Q  x& N. K+ a) zSQLFiddle
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则