从SQL中的双转义JSON列中提取值

从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 您创建了

我有下面带有端口列的端口列表表:

港口 预期输出 “[{\'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),“\”}],“”)