如何将此字符串拆分为 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的主要内容,如果未能解决你的问题,请参考以下文章