回答

收藏

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

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

通常,WM_CONCAT是一个聚合函数,它从表中返回用逗号分隔的值,如下所示。) z' N' Q9 [+ x! u
假设我有一个foo像这样的表:; Y$ A; U! v) \+ _
col_id     | col_text
& b6 m" U  f) l9 ]
8 `) `/ V; q$ Z! y111        | This
# Z, o! Y( g9 z2 M2 m111        | is" C% Y( j. Y, S4 ^+ P; U
111        | a% ^0 b( v$ b9 N) L! C  Y+ V/ I
111        | test.
  G4 b5 ~1 |0 O" O$ c+ s如果我使用此查询:6 r& S9 C& N) j$ B6 s
SELECT CAST(WM_CONCAT(col_text) AS VARCHAR2(100)), col_id FROM foo& T: F# J; \6 F8 z# F- s/ `
结果将是# b) P6 H* ?* l: ?5 ^: _. K
This, is, a, test.
/ ~! o; Q& E3 p9 N是否有可能改变分离器(',')到其他字符,如'.'或'|'的的WM_CONCAT()功能?
6 f* d* W! ~1 N  R7 L) g# e还是创建一个可以像这样执行的用户定义函数WM_CONCAT()?' a" A' w# w: }/ j
               
! j: Z" l7 o. O: y解决方案:
! m# ^5 S2 s0 O0 j0 ?* G- ?% z                3 Y8 o4 Z' P1 |+ _, ]3 F' w3 I

6 h, V! R! [2 b! ]/ x9 z+ z8 O+ Y5 |) W! z; b3 L
                您可能要使用; {2 }9 b1 Z/ H6 e1 O# j
LISTAGG。
& M# @& f8 L! W0 f/ ?, wSELECT col_id, ' N0 z  e0 o+ |& _( o- g5 t
       LISTAGG(col_text, '|') WITHIN GROUP (ORDER BY col_text) text
, h; R" |# K- s9 ^1 I/ V7 u8 x  FROM table1& v% `) {  k' @3 U
GROUP BY col_id, G# I, X# c2 t
输出:5 e+ w5 R/ U3 j1 c  z
| COL_ID |            TEXT |7 L6 S. l/ C* i! D
----------------------------
& i$ p* w# C2 f" \|    111 | This|a|is|test. |
; D2 b3 ~) r  T6 t$ WSQLFiddle
; Q3 I) G  {8 M- @  t更新 如果您需要在列表中获取不同的文本值
, y" |1 b- i1 Q  _; kSELECT col_id,
& g1 _+ C, w7 K       LISTAGG(col_text, '|')
2 h+ Q8 i; Q3 g$ I- ]         WITHIN GROUP (ORDER BY col_text) text% _! ?$ I* q1 N9 J  ]* z: n, b
  FROM 7 C/ R8 d  ?7 E( }/ m4 q- N4 X& D% a
(
' K" \  z; x; T6 f# W# b  SELECT DISTINCT col_id, col_text! Q8 _* A( m/ h2 ~  |+ X" m2 L
    FROM table1$ `# m6 y# Q3 {5 @3 O" ^- H
)* S$ r: b5 t" o9 a3 u
GROUP BY col_id
* V! {2 l" G) g5 ?SQLFiddle
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则