如何将此字符串拆分为 UDF

Posted

技术标签:

【中文标题】如何将此字符串拆分为 UDF【英文标题】:How can I split this string as a UDF 【发布时间】:2019-05-31 14:37:47 【问题描述】:

我有这个列(来自 BigCommerce 数据库的导出),它在单个列中包含自定义字段。这是数据的一个示例:

["Name":"Unit Number","Value":"3698","Name":"Region","Value":"Eastern Great Lakes (WNY, W PA)"]

我需要一种方法来弄清楚如何从中提取字段/值对。在这个示例中,我想得到,作为输出:

Unit Number:3698
Region:Eastern Great Lakes (WNY, W PA)

我希望因此有一个 UDF,我可以将它作为选择查询的一部分运行,它只给我字段名称和作为字符串输出的值(如上例所示)。源表中的每一列数据都有这种格式。通常,列数据有两个字段/值对,但有时没有,有时两个,有时三个。换句话说,该列包含任意数量的可变字段/值对。

是否有人对如何构建 UDF 以帮助从该字符串中获取这些数据元素有任何建议?

我正在修补一些东西,但我被困住了。我开始尝试删除无关的字符 [,], ,它们描绘了字段和值。我正在修改字符串拆分函数,但不是在单个字符上拆分,而是我不知道如何根据开括号或右括号 , 进行拆分以缩小范围。

Unit Number:3698 | Region:Eastern Great Lakes (WNY, W PA)

【问题讨论】:

这似乎是 JSON 内容。您是否考虑过使用 SQL Server 的 JSON 函数? MSSQL 2016 及更高版本支持 JSON(这就是你所拥有的),请参阅 JSON_VALUE() 【参考方案1】:
DECLARE @json NVARCHAR(MAX)
SET @json =  N'["Name":"Unit Number","Value":"3698","Name":"Region","Value":"Eastern Great Lakes (WNY, W PA)"]' 

--read from json
SELECT [Name], [Value]  
FROM OPENJSON(@json)
  WITH ([Name] NVARCHAR(100) '$.Name',  
        [Value] NVARCHAR(50) '$.Value')  

--if it has only these two fixed cols like Unit Number, Region starts here
SELECT [Region],[Unit Number] from 
             (
                SELECT [Name], [Value]  
                    FROM OPENJSON(@json)
                      WITH ([Name] NVARCHAR(100) '$.Name',  
                            [Value] NVARCHAR(50) '$.Value') 
            ) x
            pivot 
            (
                MAX([Value])
                for [Name] in ([Region],[Unit Number])
            ) p 
--if it has only these two fixed cols like Unit Number, Region ends here

--********if it has dynamic columns starts here********
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME([Name])  
            FROM OPENJSON(@json)
              WITH ([Name] NVARCHAR(100) '$.Name',  
                    [Value] NVARCHAR(50) '$.Value') 

            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT ' + @cols + ' from 
             (
                SELECT [Name], [Value]  
                    FROM OPENJSON(@json)
                      WITH ([Name] NVARCHAR(100) ''$.Name'',  
                            [Value] NVARCHAR(50) ''$.Value'') 
            ) x
            pivot 
            (
                MAX([Value])
                for [Name] in (' + @cols + ')
            ) p ' 

print @query
EXEC sp_executesql @query, N'@json NVARCHAR(MAX)', @json
--********if it has dynamic columns ends here********

注意:这仅适用于 MSSQL 2016/17 或更高版本,使用 v17.1

【讨论】:

以上是关于如何将此字符串拆分为 UDF的主要内容,如果未能解决你的问题,请参考以下文章

如何将数字拆分为数字并在其间添加一个字符

如何在 C++ 中将数字字符串拆分为数组? [复制]

将数组拆分为字符串[关闭]

如何将字符串数组拆分为新的字符串数组并删除重复项

如何在 SQL Server 中将拆分函数转换为内联表值 udf?

在 SQL 中拆分长字符串