Arrays 在T-SQL中解析JSON数组

Arrays 在T-SQL中解析JSON数组,arrays,json,sql-server,tsql,Arrays,Json,Sql Server,Tsql,在SQL Server表中,我们有一个json对象,该对象存储在字符串数组中。我想通过编程将该字符串拆分为几列。然而,我似乎无法让它工作,或者即使它是可能的 这是在WITH子句中创建多个列的一种可能性,还是在select语句中创建多个列更明智 我删减了一些代码,对所给出的内容给出了一个过于简单的概念 示例JSON类似于{“arr”:[“str1-str2”]} SELECT b.* FROM [table] a OUTER APPLY OPENJSON(a.value, '$.arr') WIT

在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

由于标签
[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;
一个相当简短的方法(但仅适用于这个简单的示例)是:

SELECT t.ID
      ,A.*
FROM @tbl t
OUTER APPLY OPENJSON(JSON_QUERY(YourJSON,'$.arr')) A 
暗示 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;

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

我不知道在JSON中拆分字符串的任何方法。我想知道问题是否在于JSON包含单个字符串而不是多个值

下面的示例显示如何从数组中提取每个字符串;如果您想更进一步,在连字符上拆分这些字符串,将演示如何使用SQL的普通子字符串和CHARINDEX函数进行拆分

create table [table]
(
    value nvarchar(max)
)

insert [table](value)
values ('{ "arr": ["str1 - str2"] }'), ('{ "arr": ["1234 - 5678","abc - def"] }')

SELECT b.value
, rtrim(substring(b.value,1,charindex('-',b.value)-1))
, ltrim(substring(b.value,charindex('-',b.value)+1,len(b.value)))
FROM [table] a
OUTER APPLY OPENJSON(a.value, '$.arr') b
如果希望所有值都在一列中,可以使用
string\u split
函数:


注意:
{“arr”:[“str1-str2”]}
是一个包含单个字符串的数组<代码>{“arr”:[“str1”,“str2”]}是一个包含2个字符串的数组。您是指后者,还是前者正确?SQL Server中没有
SPLIT
。SQL Server 2016+中存在字符串分割。不过,您可能应该修复JSON内容。如果您想要字符串数组,为什么要使用
[“str1-str2”]
而不是
[“str1”,“str2”]
?我更喜欢
OPENJSON
而不是
STRING\u SPLIT()
,因为它以给定的顺序返回,而
STRING\u SPLIT()
并不能保证这一点。将CSV转换为JSON数组很容易。我的回答中有一个例子。啊,好把戏;在解析JSON之前操作字符串;鬼鬼祟祟的
SELECT ltrim(rtrim(c.value))
FROM [table] a
OUTER APPLY OPENJSON(a.value, '$.arr') b
OUTER APPLY STRING_SPLIT(b.value, '-') c