在 T-SQL 中解析 JSON 数组

tjg*_*g92 5 t-sql sql-server arrays json

在我们的 SQL Server 表中,我们有一个存储有字符串数组的 json 对象。我想以编程方式将该字符串拆分为几列。但是,我似乎无法让它工作,或者即使有可能。

这是在 WITH 子句中创建多个列的可能性,还是在 select 语句中执行此操作更明智?

我删减了一些代码,以对给出的内容给出一个简单的想法。

JSON 示例类似于 { "arr": ["str1 - str2"] }

SELECT b.* FROM [table] a
OUTER APPLY
OPENJSON(a.value, '$.arr')
WITH
(
    strSplit1 VARCHAR(100) SPLIT('$.arr', '-',1),
    strSplit2 VARCHAR(100) SPLIT('$.arr', '-',2)
) b
Run Code Online (Sandbox Code Playgroud)

Shn*_*ugo 8

由于标签[tsql]和用法,OPENJSON我假设这是 SQL-Server。但可能是错误的...请始终指定您的 RDBMS(带版本)。

你的 JSON 很奇怪......我认为你在为了简洁起见试图简化它的时候做得太过分了......

尝试这个:

DECLARE @tbl TABLE(ID INT IDENTITY,YourJSON NVARCHAR(MAX));
INSERT INTO @tbl VALUES(N'{ "arr": ["str1 - str2"] }') --weird example...
                      ,(N'{ "arr": ["a","b","c"] }');  --array with three elements

SELECT t.ID
      ,B.[value] AS arr
FROM @tbl t
CROSS APPLY OPENJSON(YourJSON) 
WITH(arr NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.arr) B;
Run Code Online (Sandbox Code Playgroud)

一个相当简短的方法(但只适合这个简单的例子)是这样的:

SELECT t.ID
      ,A.*
FROM @tbl t
OUTER APPLY OPENJSON(JSON_QUERY(YourJSON,'$.arr')) A 
Run Code Online (Sandbox Code Playgroud)

暗示

SQL-Server 2016 引入了 JSON 支持

更新:如果 JSON 的内容是一个奇怪的 CSV 字符串......

有一个技巧可以将 CSV 转换为 JSON 数组。尝试这个

DECLARE @tbl TABLE(ID INT IDENTITY,YourJSON NVARCHAR(MAX));
INSERT INTO @tbl VALUES(N'{ "arr": ["str1 - str2"] }') --weird example...
                      ,(N'{ "arr": ["a","b","c"] }')  --array with three elements
                      ,(N'{ "arr": ["x-y-z"] }');     --array with three elements in a weird CSV format

SELECT t.ID
      ,B.[value] AS arr
      ,C.[value]
FROM @tbl t
CROSS APPLY OPENJSON(YourJSON) 
WITH(arr NVARCHAR(MAX) AS JSON) A
CROSS APPLY OPENJSON(A.arr) B
CROSS APPLY OPENJSON('["' + REPLACE(B.[value],'-','","') + '"]') C;
Run Code Online (Sandbox Code Playgroud)

中的一些简单替换OPENJSON('["' + REPLACE(B.[value],'-','","') + '"]')将从您的 CSV 字符串中创建一个 JSON 数组,该数组可以在 OPENJSON 中打开。