【问题标题】:How to convert JSON column values into separated schema with many rows in SQL Server?如何在 SQL Server 中将 JSON 列值转换为具有多行的单独架构?
【发布时间】:2018-05-22 00:14:15
【问题描述】:

我有一个只有一列的数据集具有JSON 格式。这是表格中的快照:

这里只有 JSON 中的 Genres 列,我想创建另一个表,以便该表中的每一行有很多行,以列出流派 id 和名称,并通过主键连接两个表

我使用了SQL Server 中的OPENJSON,但我得到的只是一条记录而不是整张桌子

DECLARE @json nvarchar(MAX) = (SELECT TOP (1) [Genres]
  FROM [IMDB_movies].[dbo].[Genre_movies])

 SELECT * 
 FROM OPENJSON(@json)
 WITH (id FLOAT,
 name VARCHAR(100))

但我不知道如何将表中的整个流派记录转换为主表中流派记录中每个标签的多行新表。

【问题讨论】:

  • 你确定,它在所有 JSON 值中只有 Id 和 Name 列吗?

标签: json sql-server


【解决方案1】:

试试这个答案:

DECLARE @Genre_movies TABLE(Generes VARCHAR(8000))
INSERT INTO @Genre_movies VALUES('[{"id":"28","name":"Action"},{"id":"12","name":"Adventure"}]')
INSERT INTO @Genre_movies VALUES('[{"id":"16","name":"Animation"},{"id":"14","name":"Fantasy"}]')

DECLARE @Result TABLE(ID INT,Name VARCHAR(20))

SELECT Generes,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN
INTO #Temp
FROM @Genre_movies

DECLARE @MIN INT,@MAX INT,@JSONValue VARCHAR(MAX)
SELECT @MAX=MAX(RN),@MIN=MIN(RN) FROM #Temp

WHILE(@MAX>=@MIN)
BEGIN
    SELECT @JSONValue=Generes FROM #Temp WHERE RN=@MIN

    INSERT INTO @Result
    SELECT * 
     FROM OPENJSON(@JSONValue)
     WITH (id FLOAT,
     name VARCHAR(100))

    SET @MIN=@MIN+1
END

SELECT * FROM @Result
DROP TABLE #Temp

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 2021-12-21
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    相关资源
    最近更新 更多