sql-server - 使用 SQL : How to extract a record within a JSON object? 解析 JSON

标签 sql-server json string tsql

我正在查看 SQL Server 表中的大约 13,000 行,并尝试解析存储为 json 的一列中的某些值。

json 列值看起来像这样:

..."http://www.companyurl.com","FoundedYear":"2007","Status":"Private","CompanySize":"51-200","TagLine":"We build software we believe in","Origi...

我想提取“CompanySize”的值,但并非所有行都包含此属性。其他复杂因素:

  • 我不确定“CompanySize”参数中有多少个可能的值。
  • “CompanySize”并不总是跟在“TagLine”参数之后。

我确定的一个规则:CompanySize 值始终是一个未知长度的字符串,它跟在 varchar 字符串 "CompanySize":" 之后并在下一个 "," 字符串。

理想情况下,我们会完全升级到 SQL Server 2016,这样我就可以利用 SQL Server's JSON support ,但事实并非如此。

最佳答案

您可以使用 CHARINDEX 执行此操作,因为您可以将开始位置传递给它,这将使您能够获得结束 "。您可能不应该寻找 "," 因为如果 CompanySize 是最终属性,它不会在该片段的末尾有 ,"。将其作为内联表值函数 (iTVF) 执行会非常高效(特别是因为 13k 行几乎没有),您只需要将它与 CROSS APPLYOUTER APPLY< 一起使用:

USE [tempdb];
GO

CREATE FUNCTION dbo.GetCompanySize(@JSON NVARCHAR(MAX))
RETURNS TABLE
AS RETURN

WITH SearchStart AS
(
  SELECT '"CompanySize":"' AS [Fragment]
), Search AS
(
  SELECT CHARINDEX(ss.Fragment, @JSON) AS [Start],
         LEN(ss.Fragment) AS [FragmentLength]
  FROM   SearchStart ss
)
SELECT CASE Search.Start
         WHEN 0 THEN NULL
         ELSE SUBSTRING(@JSON,
                        (Search.Start + Search.FragmentLength),
                        CHARINDEX('"',
                                  @JSON,
                                  Search.Start + Search.FragmentLength
                                 ) - (Search.Start + Search.FragmentLength)
                       )
       END AS [CompanySize]
FROM Search;
GO

设置测试:

CREATE TABLE #tmp (JSON NVARCHAR(MAX));

INSERT INTO #tmp (JSON) VALUES
('"http://www.companyurl.com","FoundedYear":"2007","Status":"Private","CompanySize":"51-200","TagLine":"We build software we believe in","Origi..');
INSERT INTO #tmp (JSON) VALUES
('"http://www.companyurl.com","FoundedYear":"2009","Status":"Public","TagLine":"We build software we believe in","Origi..');
INSERT INTO #tmp (JSON) VALUES (NULL);

运行测试:

SELECT comp.CompanySize
FROM   #tmp tmp
CROSS APPLY tempdb.dbo.GetCompanySize(tmp.JSON) comp

返回:

CompanySize
-----------
51-200
NULL
NULL

关于sql-server - 使用 SQL : How to extract a record within a JSON object? 解析 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31709066/

相关文章:

sql-server - Visual Studio 2012 的数据库资源管理器中缺少图表文件夹

ASP.NET、SQL 2005 "paging"

javascript - Youtube 数据 API 视频嵌入限制

java - Java 中的字符串修剪

c# - Microsoft Sync Framework - 双向同步如何工作?

php - 将Json android Namevaluepair中的数据发送到php服务器

javascript - 如何将 JSON 数据放入 html/javascript 网格表中

python - 如何用空格填写 Python 字符串?

javascript - 从字符串中删除前导零和尾随零

sql-server - SQL : How to improve performance for INNER JOIN with CASE