根據某一字段值相同合併字串 - - 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...