我目前正在设法获取注册到我们应用程序的所有用户的通讯组列表。我们正在使用SQL Server来存储信息,但是,由于在不久的将来将迁移到非关系数据库架构,我们的大多数数据都以JSON字符串形式存储在一个字段中(这是一个VARCHAR(max)字段,看起来像JSON)。当我们将数据提供回Java控制器时,我们将String转换为JSON Object。正如我的问题最有可能表明的那样,用户列表位于此JSON字符串中。虽然我知道我可以做SELECT JSON_DATA FROM MYTABLE
来获取该字段的所有条目,将其转换为Java,然后以这种方式获取users字段,但实际上,我将返回大量的数据并丢弃其中的95%。
我想知道SQL Server中是否可以解析JSON字符串?基本上,我要使用下表:
<table style="width:100%" border="1">
<tr>
<th>ID</th>
<th>JSON_DATA</th>
</tr>
<tr>
<td>1</td>
<td>{"data":data,"users":["User1", "User2"]}</td>
</tr>
<tr>
<td>2</td>
<td>{"data":data2,"users":["User2", "User3"]}</td>
</tr>
</table>
我想从我的SQL例程中返回所有唯一用户的列表。
答案 0 :(得分:1)
如果没有本机JSON支持,恐怕您正在寻找良好的字符串解析。这应该可以帮助您:传回一个单独的字符串
“用户1”,“用户2”,“用户2”,“用户3”
DECLARE @ThisUserString VARCHAR(255)
, @FullUserString VARCHAR(255) = ''
DECLARE @xmlSTring VARCHAR(MAX) =
'<table style="width:100%" border="1">
<tr>
<th>ID</th>
<th>JSON_DATA</th>
</tr>
<tr>
<td>1</td>
<td>{"data":data,"users":["User1", "User2"]}</td>
</tr>
<tr>
<td>2</td>
<td>{"data":data2,"users":["User2", "User3"]}</td>
</tr>
</table>'
WHILE CHARINDEX('[', @xmlSTring) > 0
BEGIN
-- Find the next set of users, like ["User1", "User2"]
SELECT @ThisUserString =
SUBSTRING(
@xmlSTring
, /*start*/ CHARINDEX('[', @xmlSTring)
, /*length*/ CHARINDEX(']', @xmlSTring) - CHARINDEX('[', @xmlSTring) + 1
)
-- Add them to the list of all users, like "User1", "User2"
SELECT @FullUserString += ', ' +
SUBSTRING(
@xmlSTring
, /*start*/ CHARINDEX('[', @xmlSTring) + 1
, /*length*/ CHARINDEX(']', @xmlSTring) - CHARINDEX('[', @xmlSTring) - 1
)
-- And remove this set from the string so our WHILE loop will end sometime:
SET @xmlSTring = REPLACE(@xmlSTring, @ThisUserString, '')
END
SET @FullUserString = RIGHT(@FullUserString, LEN(@FullUserString) - 2) -- remove the initial comma
SELECT @FullUserString
答案 1 :(得分:0)
我认为这可以满足您的需求:
Select JSON_QUERY([fieldName], $.users)
这里也有一个要签出的链接:https://docs.microsoft.com/en-us/sql/t-sql/functions/json-query-transact-sql?view=sql-server-2017