回答

收藏

如何在SQL Server中将多行文本合并为单个文本字符串?

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

考虑一个包含名称的数据库表,该表具有三行:
6 M2 I5 C' @! ]( n; f$ g# u0 ^  D1 h6 fPeter
1 H% e' `* p. _' ^& F) M0 UPaul
! D9 x+ l& f4 C# wMary
0 I: r) A1 k3 y9 f6 s9 d0 ^& O
/ m$ g$ e% v3 z% A  ~3 g有没有简单的方法可以将其转换为单个字符串Peter, Paul, Mary?& u! |/ L' P/ I8 b4 h! V
                9 w3 G8 ~' D  q% b; |8 ?: u
解决方案:- g$ k, k7 b+ M- w' h" m' U& G! a
                4 ?, u% a3 P; C1 A3 M6 h

! Z4 j( U+ }. O5 Q5 O) ]: a  U7 A( V/ G
                如果您使用的是SQL Server 2017或Azure,请参阅Mathieu Renda的答案。! n3 B8 _& t9 P9 ^
当我尝试将两个具有一对多关系的表联接在一起时,我遇到了类似的问题。在SQL 2005中,我发现该XML PATH方法可以非常轻松地处理行的串联。
: A6 ~3 L- X4 d- h! Z如果有一个表叫做 STUDENTS
2 ^5 p* {- g) l0 z' W( GSubjectID       StudentName$ i, o5 G' M% B' Q6 K( K
----------      -------------
4 h3 u4 j$ b) ~$ T7 \1 u# ?! H1               Mary! V. H& Z2 G+ z5 K9 s
1               John
# R; V3 e# b$ {1               Sam6 k! ~" {; ^0 s; h9 u2 c
2               Alaina0 s' ]. ~, b% f) j
2               Edward9 z% o9 C3 B* M2 h6 J- H) m) c0 |

/ s$ B: ~. s" `, `我预期的结果是:
: w9 x* B& R( M) J! VSubjectID       StudentName
: f  m# K% @- {/ g----------      -------------0 w3 N' ?) o+ O9 \
1               Mary, John, Sam* J( K) x0 r& ?
2               Alaina, Edward) X0 ]; R, S# G) |4 I3 i* ?$ l
, I$ |9 T9 P# s! O0 I& N& @
我使用了以下内容T-SQL:
5 L1 ~! n6 R# ~; `0 \SELECT Main.SubjectID,* ?" \, z: O! T. Y, ]( L$ R& F
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"( ?$ }  o. f: ?: @$ [+ T9 d" v0 C
FROM
' X- F- D5 \/ K    (
1 v2 |4 C; V* H        SELECT DISTINCT ST2.SubjectID,
; L- V) z* L: ?4 A8 J  a0 ~            (4 \7 q2 ]6 B4 L' Z$ m
                SELECT ST1.StudentName + ',' AS [text()]- A+ N6 b0 c5 T: f& }
                FROM dbo.Students ST1, D! E5 t" H' T$ G5 T( p
                WHERE ST1.SubjectID = ST2.SubjectID( c$ B$ @2 b$ P6 l& {" I! P, B
                ORDER BY ST1.SubjectID
. n4 }, `5 D' v9 \# h5 ?                FOR XML PATH ('')6 v# H) D7 ^1 n
            ) [Students]5 r# W, B' r) R& I
        FROM dbo.Students ST2
, p$ N5 O7 D" S2 Q8 W    ) [Main]$ C- S. [+ O( e$ C' R
  [. r. T2 l* ?
如果可以在开头合并逗号并用于substring跳过第一个逗号,则可以以更紧凑的方式执行相同的操作,因此您无需执行子查询:; |) T+ A; h  Q4 n- ^
SELECT DISTINCT ST2.SubjectID, ) X& o7 K1 _$ j+ p( L4 ?
    SUBSTRING(
& s( E: D0 S  m( L$ ]( s        (4 a, y1 `( Y/ x
            SELECT ','+ST1.StudentName  AS [text()]+ _" g! X& u' W; B
            FROM dbo.Students ST1
& y/ E7 h7 s3 U- M6 o2 I/ J, J6 @            WHERE ST1.SubjectID = ST2.SubjectID
# y* D& I5 i; L            ORDER BY ST1.SubjectID4 p' f( y" g, K' ^
            FOR XML PATH ('')0 v+ \" r$ Q* d  c2 @& F4 [4 s8 R
        ), 2, 1000) [Students]
- x" ^( E& O4 g. Z4 S/ i3 ^  jFROM dbo.Students ST2
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则