根據某一字段值相同合併字串 SQL

2021-06-19 02:23:38 字數 3427 閱讀 9445

根據某一字段值相同合併字串 - - sql

做專案的過程中,遇到乙個問題,相同id,不同value的記錄希望合併成一條記錄,value以逗號分隔,從網上搜了搜解決方案,整理如下,備忘。

一、           字串合併

表名:test

字段:

id               int

name        nvarchar(50)

字段值:

期望結果:

id               namestr

1                a,b,c

2                d,e

3                f

sql

實現:1、

利用函式解決

-- 建立處理函式

create

function dbo.f_str(@id int)

returns

varchar

(8000) as

begin

declare @r varchar

(8000)

set @r =''

select @r = @r +

','+ [name]

from [test]

where [id]=@id

return

stuff

(@r, 1, 1,'')

end go

-- 呼叫函式

select [id], [namestr]=dbo.f_str(id)

from [test]

group

by [id]

執行結果:

2、

直接用sql

解決select*

from(

select

distinct [id]

from [test]

)aouter

select

[namestr]=

stuff

(replace

(replace(

( select [name] from [test] n

where [id] = a.id

forxml

auto ),

',','

),'"/>',''

), 1, 1,'')

)m執行結果:

看不懂這個sql不要緊,下面有詳細分析

二、           詳細分析

1、  stuff

作用:

stuff函式將字串插入另一字串。它在第乙個字串中從開始位置刪

除指定長度的字元;然後將第二個字串插入第乙個字串的開始位置。

語法:

stuff ( character_expression , start , length ,character_expression )

引數:

character_expression

乙個字元資料表示式。character_expression可以是常量、變數,也可

以是字元列或二進位制資料列。

start

乙個整數值,指定刪除和插入的開始位置。如果start或length為負,

則返回空字串。如果start比第乙個character_expression長,則返

回空字串。start可以是bigint型別。

length

乙個整數,指定要刪除的字元數。如果length比第乙個

character_expression長,則最多刪除到第乙個character_expression

中的最後乙個字元。length可以是bigint型別。

返回型別:

如果character_expression是受支援的字元資料型別,則返回字元資料。

如果character_expression是乙個受支援的 binary 資料型別,則返回二

進製資料。

注釋:

如果開始位置或長度值是負數,或者如果開始位置大於第乙個字串的長

度,將返回空字串。如果要刪除的長度大於第乙個字串的長度,將刪

除到第乙個字串中的最後乙個字元。如果結果值大於返回型別支援的最

大值,則產生錯誤。

示例:

select

stuff

('abcdef'

, 2, 3,

'ijklmn');

go結果:

select

stuff

('abcdef'

,-2, 3,

'ijklmn');

go結果:

select

stuff

('abcdef'

, 2, 10,

'ijklmn');

go結果:

與outer

用示例來區分兩者:

第一張表:

表名:student

欄位名:

字段值:

第二張表:

表名:student_class

欄位名:

字段值:

select*

from [student] a

cross

select [class], [score]

from [student_class]

where student_id = a.id

) b執行結果:

outer

select*

from [student] a

outer

select [class], [score]

from [student_class]

where student_id = a.id

) b執行結果:

3、  for

xmlauto

將結果轉換為xml結構,例如對於上面2中的student表,執行以下語句

select*

from [student]

forxml

auto

執行結果:

其中for xml還有其他方式:raw、explicit和path,有興趣的同學可以深入研究,這裡不再贅述。

根據某一字段值相同合併字串 SQL

做專案的過程中,遇到乙個問題,相同id,不同value的記錄希望合併成一條記錄,value以逗號分隔,從網上搜了搜解決方案,整理如下,備忘。一 字串合併 表名 test 字段 id int name nvarchar 50 字段值 期望結果 id namestr 1 a,b,c 2 d,e 3 f ...

php中有關合併某一字段鍵值相同的陣列合併的改進

下面是實現 關於引數的說明 key鍵值相www.cppcns.com同的鍵名 程式設計客棧array代表原陣列 start代表 array 0 key newkey代表相同鍵值相同的鍵名 bukwht functionwww.cppcns.com combine same val array,sta...

arcpy批量更新shp某一字段的值

提取檔名更新到dlbh欄位 encoding utf 8 import csv import arcpy import os shuju r d short2.gdb wenjianjia r d desktop csv.gdb fish r d desktop yw fishnet.shp res...