首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在T-SQL中解析JSON数组

在T-SQL中解析JSON数组
EN

Stack Overflow用户
提问于 2018-10-24 23:25:05
回答 2查看 8.5K关注 0票数 5

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

是否可以在WITH子句中创建多个列,或者在select语句中创建多列是更明智的做法?

我删减了一些代码,给出了一个简单化的想法。

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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2018-10-24 23:33:10

考虑到标记[tsql]OPENJSON的用法,我假设这是SQL-Server。但可能是错的..。请始终指定您的RDBMS (带版本)。

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

试试这个:

代码语言:javascript
复制
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;

一个相当简短的方法(但仅适用于这个简单的示例)是这样的:

代码语言:javascript
复制
SELECT t.ID
      ,A.*
FROM @tbl t
OUTER APPLY OPENJSON(JSON_QUERY(YourJSON,'$.arr')) A 

提示

SQL-Server 2016引入了JSON支持

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

这里有一个将CSV转换为JSON数组的技巧。尝尝这个

代码语言:javascript
复制
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-string创建一个JSON数组,该数组可以在OPENJSON中打开。

票数 8
EN

Stack Overflow用户

发布于 2018-10-24 23:37:54

我不知道有什么方法可以在JSON中拆分字符串。我想知道问题是不是由于您的JSON包含单个字符串而不是多个值造成的?

下面的示例展示了如何从数组中提取每个字符串;如果您希望进一步拆分这些字符串,可以使用SQL的普通SUBSTRING和CHARINDEX函数来实现。

代码语言:javascript
复制
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_split函数:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

代码语言:javascript
复制
SELECT ltrim(rtrim(c.value))
FROM [table] a
OUTER APPLY OPENJSON(a.value, '$.arr') b
OUTER APPLY STRING_SPLIT(b.value, '-') c
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52972726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档