Sql server 将文本从分隔字符串提取到另一个分隔字符串TSQL中
我有这个字符串,例如Green/1051;布朗/1258;红色/1110;黄色/1024;红色/1147 我希望能够从1051中得到以下字符串:;1258;1110;1024;1147; 我尝试过多种解决方案,但它们往往只针对一个“部分”。如果这是不可能的,那么我可以在c端格式化它,但是如果能够在我的存储过程中这样做就好了 谢谢Sql server 将文本从分隔字符串提取到另一个分隔字符串TSQL中,sql-server,tsql,Sql Server,Tsql,我有这个字符串,例如Green/1051;布朗/1258;红色/1110;黄色/1024;红色/1147 我希望能够从1051中得到以下字符串:;1258;1110;1024;1147; 我尝试过多种解决方案,但它们往往只针对一个“部分”。如果这是不可能的,那么我可以在c端格式化它,但是如果能够在我的存储过程中这样做就好了 谢谢 编辑:不幸的是,这是一个第三方数据集,所以我使用C格式化了这些数据。从下面的答案来看,我同意SQL不是为了能够提取和解析我需要的内容而设计的,它只是更易于维护 搜索分隔
编辑:不幸的是,这是一个第三方数据集,所以我使用C格式化了这些数据。从下面的答案来看,我同意SQL不是为了能够提取和解析我需要的内容而设计的,它只是更易于维护 搜索分隔符dsplit8k。 这将允许您将字符串转换为多行,并在 然后可以使用STUFF..FOR XML来重建字符串 或者,如果您知道您总是需要所有的数字和分号,而不需要可以使用的Alpha和空格
REPLACE(REPLACE(instring,[A-Z],''),' ','')
我假设需要在服务器上解析数据的原因是为了在更大的查询中使用它。否则就没有理由在服务器上解析它。在C语言中这样做要容易得多(如使用正则表达式) 在不知道它是哪台SQL Server的情况下,我假设它是2016年或更高版本,因为这允许我们通过将\替换为:and,将字符串转换为JSON值;具有在旧版本中可以使用类似的技术将字符串转换为XML 假设这个简单的表:
declare @table table (id int identity primary key,col varchar(max))
insert into @table (col)
values ('Green/1051;Brown/1258;Red/1110;Yellow /1024;Red/1147;')
我们可以使用STUFFcol、lencol、1来删除后面的分号。此查询:
select stuff(col,len(col),1,'')
from @table
给予
Green/1051;Brown/1258;Red/1110;Yellow /1024;Red/1147
更换/和;与
给出:
Green":"1051","Brown":"1258","Red":"1110","Yellow ":"1024","Red":"1147
我们现在只需要用{和}包围这个值来完成JSON字符串
完成此操作后,我们可以使用OPENJSON:
select *
from @table
cross apply openjson('{"' + replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}')
select id,[key],value
from @table
cross apply openjson('{"' +
replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}') x
这将从源表返回id、col列,并从OPENJSON返回key、value和type列:
select *
from @table
cross apply openjson('{"' + replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}')
select id,[key],value
from @table
cross apply openjson('{"' +
replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}') x
将返回:
id key value
1 Green 1051
1 Brown 1258
1 Red 1110
1 Yellow 1024
1 Red 1147
我们可以将这些结果与另一个表连接起来。假设这些数字是项目ID,我们有一个库存表,其中包含每个项目的库存金额:
declare @inventory table (colorid int,amount int)
insert into @inventory (colorid,amount)
values
(1051,5),
(1258,10),
(1110,24),
(1024,2),
(1147,22)
哪些项目的金额超过20
select id, [key],colorid,amount
from @table
cross apply openjson('{"' + replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}') x
inner join @inventory i on i.colorid=x.value
where amount>20
结果是:
id key colorid amount
1 Red 1110 24
1 Red 1147 22
SQL语言不是用于字符串解析的。首先,为什么要在SQL中解析这个字符串?您不能利用索引或查询。如果您使用的是SQL Server已经支持的格式,如XML或JSON,您至少可以查询数据我已经尝试了多种解决方案->请添加您的代码您首先要做什么?如果需要部分数据,为什么要将其存储为如下字符串?为什么服务器要解析它?是否要在其他查询中使用结果?答案很重要。如果您想在更大的查询中使用结果,则应该考虑使用适当的表设计,例如使用稀疏列或单独的相关表。另一种选择是替换/和;使用and“使其看起来像JSON,允许您使用OPENJSON将值提取为结果集。@PanagiotisKanavos这是一个第三方表,数据未输入my me。相信我,我知道这是一种非常糟糕的数据存储方式。如果这不可能,我将在C端格式化。@JackWaters您还没有解释您想要什么。是否要在查询中使用结果?如果没有,为什么还要费心在数据库中解析呢?您使用的是什么版本的SQL Server?这不是一个有用的答案。DelimitedSplit8K只是Aaron Bertrand给他正在进行基准测试的技术之一起的名字。告诉某人只是搜索文章并没有多大帮助。此外,可以使用XML技术将字符串转换为具有可查询属性的适当XML字符串,而不是多次拆分[a-Z]列是什么?如果是字符串替换,则不支持模式表达式。@PanagiotisKanavos它实际上是Jeff Moden给他设计的字符串命名的。@Larnu我知道,但我不想用谷歌搜索它。回答者应该这样做。在这一点上,我同意@PanagiotisKanavosThanks的说法。是的,是SQL 2016