更改Oracle 11gR2的WM_CONCAT函数的分隔符
技术问答
173 人阅读
|
0 人回复
|
2023-09-13
|
通常,WM_CONCAT是一个聚合函数,它从表中返回用逗号分隔的值,如下所示。
1 K: B- U* u3 d+ T4 }5 e5 K& s假设我有一个foo像这样的表:, C y5 J% I0 K& ^: t+ U9 R
col_id | col_text7 W5 T! b& J( l3 _
4 ]/ N, s+ e4 j/ g5 ^6 b3 k' N111 | This
4 b0 I: a F1 A8 o: ]% O( N111 | is% U" G7 m* O. c- u$ I6 Z
111 | a1 L& K- W! ~( N" b" u6 v
111 | test.
r. e4 u3 [: ^1 A7 s# I如果我使用此查询:
+ ^7 p1 k. ?$ j. q7 Q2 cSELECT CAST(WM_CONCAT(col_text) AS VARCHAR2(100)), col_id FROM foo
9 P! O; D: D* H S# ]结果将是( t) r) E( d5 P
This, is, a, test.
- K3 ?' i1 E( \ E, m) V) N/ ?是否有可能改变分离器(',')到其他字符,如'.'或'|'的的WM_CONCAT()功能?* n r1 j4 Y) c! B* E3 }; j
还是创建一个可以像这样执行的用户定义函数WM_CONCAT()?7 @! G0 K# \+ Z
3 m* Z0 G: L% n* y. @ b# l: p2 {解决方案:' ]+ E3 I7 f5 ~4 c/ Y
' O5 k* i& K- ]4 z, C1 ^; A/ Q+ G: X9 }1 H* W) `* b9 b( f
3 r7 O# m r/ s
您可能要使用; G7 g8 n2 ]2 v3 X0 ?
LISTAGG。0 Z9 y* y1 v( v
SELECT col_id,
. f# _+ w( F# z; K; L LISTAGG(col_text, '|') WITHIN GROUP (ORDER BY col_text) text" O; U" ~% {( R' p+ Z" U
FROM table1
! Y* B! `1 Q4 T% @ GROUP BY col_id
) z5 G3 {0 @% H' ?9 X9 h输出:
+ u! m7 Y; e" g* d& O# ?/ y2 c1 q. [| COL_ID | TEXT |
5 p+ K1 b" x( I8 q3 I0 k----------------------------
. Z& p, S' x0 R6 C| 111 | This|a|is|test. |+ t! ^! c/ e1 y
SQLFiddle( s4 F8 C7 H4 q& K/ E: C M
更新 如果您需要在列表中获取不同的文本值
/ z) {9 G3 b3 T* e. d5 `' VSELECT col_id, # l3 V1 E' H" i9 f' L$ Y) y" Z
LISTAGG(col_text, '|')+ L) p5 C! i: F: }
WITHIN GROUP (ORDER BY col_text) text
3 S" s8 ^' T1 v FROM 7 R# r9 h6 T: B# [/ l5 e! B
(( @ M; i# v' I: _( i& w4 E( R& M
SELECT DISTINCT col_id, col_text2 P3 x% \6 Z% O& [0 w* p; D. W
FROM table1
( J% h& P/ l8 ]" H( x)
0 [+ x$ H' O) Y7 `/ `, F GROUP BY col_id
6 }0 d7 D' I P7 m# KSQLFiddle |
|
|
|
|
|