SQL Server-在例程中将字符串转换为JSON对象

时间:2018-10-24 22:40:03

标签: json sql-server

我目前正在设法获取注册到我们应用程序的所有用户的通讯组列表。我们正在使用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例程中返回所有唯一用户的列表。

2 个答案:

答案 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