SQL 字段charindex,stuff,ltrim, for xml path('') 操作字符串 合并查询结果项值

qxyywy 2012-04-14 02:49:56
今天在处理一个功能的时候遇到一些功能解决问题 这儿贴出来供大家参考 大家看还有什么好点方法

如:表

CREATE TABLE demo(
demo_id int identity primary key,
demo_name varchar(50)
)

INSERT INTO demo VALUES('房地产开发')
INSERT INTO demo VALUES('房地产经纪/销售')
INSERT INTO demo VALUES('建筑业/工程/施工')

1 房地产开发
2 房地产经纪/销售
3 建筑业/工程/施工

另一表demo_test

CREATE TABLE demo_test(
test_id int identity primary key,
demo_ids varchar(500)
)

1 1,2,3
2 2,3

的demo_ids 中存储了如:1,2,3

想通过SQL获取demo_ids 对应的demo_name的值

如上想直接用SQL获取demo_test中demo_ids对应的值=>房地产开发,房地产经纪/销售,建筑业/工程/施工

对于用C#代码的话 相信这个没有任何难度就能实现

以下提供sql解决方案:

首先解决获取多个项的问题 这儿使用:charindex

select demo_name from demo where charindex(CONVERT(VARCHAR,demo_id)+',','1,2,3'+',')>0

这样就获取到了


房地产开发
房地产经纪/销售
建筑业/工程/施工


下一步就是将查询得到的值合并 这儿用到:stuff,ltrim, for xml path('')

SELECT stuff( (select ','+ltrim(demo_name) from demo
where charindex(CONVERT(VARCHAR,demo_id)+',','1,2,3'+',')>0 for xml path('') ),1,1,'')

如上 将两表联合查询就能得到想要的结果:

SELECT t.test_id, demoName=(SELECT stuff( (select ','+ltrim(demo_name) from demo
where charindex(CONVERT(VARCHAR,demo_id)+',',t.demo_ids+',')>0 for xml path('') ),1,1,''))
from demo_test t

1 房地产开发,房地产经纪/销售,建筑业/工程/施工
2 房地产经纪/销售,建筑业/工程/施工

这样的查询就可以到达预期效果了



...全文
215 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxyywy 2012-04-16
  • 打赏
  • 举报
回复
有处理过相关的人来说说
qxyywy 2012-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果数据量大的话,可以用字符串分割函数
SQL code

create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100))
returns @temp table(F1 varchar(100))
as
begin
……
[/Quote]

你说的数据量大是指的表数据量大 那用上述分割优势何在?我上面的代码缺点在那儿?对于底层的东西没研究 ,麻烦说讲解下
EnForGrass 2012-04-14
  • 打赏
  • 举报
回复
如果数据量大的话,可以用字符串分割函数

create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100))
returns @temp table(F1 varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return
end


----调用
select * from dbo.f_splitstr('1,2,3,4',',')
/*
F1
----
1
2
3
4

(所影响的行数为 4 行)
*/

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧