急!单元格里的内容怎么重新归类查询

baidu_19594623 2017-11-20 10:11:22
大神求解。sql查询语句~

一个单元格内容是:
“姓名”:赵钱,“性别”:男,"年龄":11

变成
姓名 性别 年龄
赵钱 男 11

只用查询就好!辛苦了!谢谢!
...全文
97 3 点赞 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
文盲老顾 2017-11-20
其实你这个问题就是一个将字符串序列化的问题,不管是正则也好,字符串切割也好,sqlserver 本身并没有提供这些方法,需要自己去建立函数来实现,甚至如果想实现自动把字段列弄出来也不是不可以,不过需要写更复杂的自定义函数 另外,你的这个还有一个关键的地方就是要保证你的数据的格式统一,否则不管怎么搞都可能出现意外情况
  • 打赏
  • 举报
回复
文盲老顾 2017-11-20
CREATE FUNCTION [dbo].[SplitStr]
(	
	@string nvarchar(max), 
	@symbol nvarchar(10)
)
RETURNS @table TABLE(id int identity,value nvarchar(max))
AS
begin 
	DECLARE @splitlen int
    SET @splitlen=LEN(@symbol)-1
    WHILE CHARINDEX(@symbol,@string)>0
    BEGIN
        INSERT @table(value) VALUES(LEFT(@string,CHARINDEX(@symbol,@string)-1))
        SET @string=STUFF(@string,1,CHARINDEX(@symbol,@string)+@splitlen,'')
    END
    INSERT @table(value) VALUES(@string)
    return
end
go


declare @tb table(id int identity,val nvarchar(max))

insert into @tb(val) values('"姓名":赵钱,"性别":男,"年龄":11'),('"姓名":王二,"性别":男,"年龄":31,"学历":大专'),('"姓名":张三,"性别":男,"年龄":21,"身高":170')

select * from @tb a
cross apply (
	select pvt.[1] as fld,pvt.[2] as v from dbo.splitStr(val,',') s1
	cross apply (
		select id,replace(value,'"','') as v from dbo.splitStr(value,':')
	) app
	pivot (max(app.v) for app.id in ([1],[2])) pvt
) app
pivot (max(v) for fld in (姓名,性别,年龄,身高,学历)) pvt -- 字段列需要手动修改,这个不知道怎么自动变成字段名
  • 打赏
  • 举报
回复
declare @s nvarchar(max)='"姓名":赵钱,"性别":男,"年龄":11'
select @s=N'select '+ replace(replace(@s,':','='''),',',''',')+''''
exec (@s)
/*
姓名	性别	年龄
赵钱	男	11
*/
  • 打赏
  • 举报
回复
相关推荐
发帖
MS-SQL Server
加入

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2017-11-20 10:11
社区公告
暂无公告