从SQL中的双转义JSON列中提取值
我有下面带有端口列的端口列表表: 港口 预期输出 “[{\'id\':193,\'name\':\'PORT C\'}” C口 [{\“id\”:204,“name\:\“PORT D\”}] D港 “[{\'id\':45,\'name\':\'PORT I\',{\'id\':193,\'name\':\'PORT C\',{\'id\':204,\'name\':\'PORT D\',{\'id\':271,\'name\':\'PORT G\'” 端口I、端口C、端口D、端口G从SQL中的双转义JSON列中提取值,sql,sql-server,string,substring,Sql,Sql Server,String,Substring,我有下面带有端口列的端口列表表: 港口 预期输出 “[{\'id\':193,\'name\':\'PORT C\'}” C口 [{\“id\”:204,“name\:\“PORT D\”}] D港 “[{\'id\':45,\'name\':\'PORT I\',{\'id\':193,\'name\':\'PORT C\',{\'id\':204,\'name\':\'PORT D\',{\'id\':271,\'name\':\'PORT G\'” 端口I、端口C、端口D、端口G 您创建了
您创建了一个soluntion,仅在存在一个端口时解析 函数CharIndex总是返回“name”:“的第一个o对应项,函数子字符串总是返回减去最后十个字符的字符串 解决此问题的一个表单是创建用户函数以返回端口的所有O相关性 尝试创建下面的函数
CREATE FUNCTION uf_findPorts
(
@string nvarchar(max)
)
RETURNS nvarchar(MAX)
AS
BEGIN
DECLARE
@length INT ,
@aux INT ,
@return NVARCHAR(MAX)
SET @length = LEN(@string)
SET @aux = 1
SET @return = ''
WHILE(CHARINDEX('"name\":\', @string,@aux) != 0)
BEGIN
SET @return = @return + ' ' + REPLACE( substring(@string,
CHARINDEX('"name\":\', @string,@aux)+10,
6),
'\"}]"',
''
)
SET @string = SUBSTRING(@string,CHARINDEX('"name\":\', @string,@aux) + 6,LEN(@string) )
END
RETURN @return
END
GO
要测试:
select ports,dbo.uf_findPorts(ports)
from ports_list
SELECT dbo.uf_findPorts('[{\"id\":45,\"name\":\"PORT I\"},{\"id\":193,\"name\":\"PORT C\"},{\"id\":204,\"name\":\"PORT D\"},{\"id\":271,\"name\":\"PORT G\"}]')
SELECT dbo.uf_findPorts('"[{\"id\":193,\"name\":\"PORT C\"}]"')
OBS:如果存在任何写入错误,您可以更正我您的
端口
列是双转义JSON,换句话说,它包含一个表示JSON对象的JSON转义字符串。
所以我们只需要将其返回到常规JSON中进行查询。让我们将其填充到一个[]
JSON数组中,然后将其传递给JSON\u VALUE
:
选择端口,
字符串_AGG(j.name,,'))
从端口列表
外部应用OPENJSON(JSON_值('['+端口+']','$[0]'))
以(名称nvarchar(100)“$.name”)作为j
按港口分组;
感谢那些试图提供帮助的人
如果将来有人遇到类似问题,请在此发布我的解决方案:
select ports = replace(replace(replace(dbo.fnRemovePatternFromString(dbo.fnRemovePatternFromString(dbo.fnRemovePatternFromString(dbo.fnRemovePatternFromString(ports,'%[\"{}]%',1),'%name:%',5),'%id:%',3),'%[0-9]%',1),'[,',''),',,',','),']','')
from ports_list
您的RDBMS是什么?有些支持编写自定义函数。你使用什么数据库?你用什么语言编码?添加这些标记。我使用Microsoft sql server。添加了标记。您的SQL Server版本是什么?这是我的版本Microsoft SQL Server 2012(SP4)(KB4018073)-11.0.7001.0(X64)@Zhorovi尝试使用您的方法,这是我得到的“JSON_值”不是可识别的内置函数名。我正在使用Microsoft SQL Server 2012。很抱歉,我刚刚意识到您有多个要聚合的值。此外,是的,您可能应该从SQL2012升级,它在2016年已经停止使用了!不幸的是,升级它超出了我的控制范围。这是我公司的决定嗨,很接近,但我的港口名称并不总是6个字符。例如,如果我的端口名是Guangzhou,它将使用您的方法仅使用前6个字符“Guangz”。此外,当一行中有多个值时,我希望它显示为“port a,port B,port C”,而不是输出端口a port B portC@rain123可以在return+'、'+REPLACE(子字符串)中包含逗号(字符串,CHARINDEX(“'name\”:\”,字符串,aux)+10,6),“\”}],“”)