从Json对象获取值包含使用SQL Query的表列

时间:2017-09-28 19:59:37

标签: sql sql-server json

我有一个表Books,在SQL Server数据库中有两列IdBookCategory,其中Id是主键,BookCategory包含JSON对象

这是我的表Books

我正在尝试将表BookCategory列值仅设为Category。为此,我编写了以下SQL查询,但我没有得到。任何人都有想要将JSON对象值作为正常列值作为查询结果。

SELECT 
    Id, BookCategory.Name AS Name, 
    BookCategory.Category AS Category 
FROM
    Books

结果如下:

Id=1
Name=CA
Category=cs

我在SQL Server Management Studio中遇到错误:

  

无法绑定多部分标识符“BookCategory.Name”。

任何帮助以获得与上表相同的结果。

提前致谢。

2 个答案:

答案 0 :(得分:4)

应该是

SELECT 
    Id, 
    JSON_VALUE(BookCategory,'$.Name') AS Name, 
    JSON_VALUE(BookCategory,'$.Category') AS Category 
FROM
    Books

文档:https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

您需要使用特殊函数在SQL中使用JSON(MS-SQL 2016支持JSON)。 Table.column表示法适用于INTEGERVARCHAR等常规SQL列类型。

答案 1 :(得分:0)

您可以使用CROSS APPLY从json列中选择多个值。

SELECT 
    BookId = b.Id, 
    BookTitle = b.Title,
    CategoryId = c.Id,
    c.Category, 
    CategoryName = c.Name
FROM Books b
    CROSS APPLY OPENJSON (b.BookCategory) WITH -- BookCategory is the json column
    (
        Id INT,
        Category VARCHAR(100),
        [Name] VARCHAR(100)
    ) c

如果愿意,您可以重命名在CROSS APPLY期间选择的列。结果与上面相同。

SELECT 
    BookId = b.Id, 
    BookTitle = b.Title,
    c.CategoryId,
    c.Category, 
    c.CategoryName
FROM Books b
    CROSS APPLY OPENJSON (b.BookCategory) WITH
    (
        CategoryId INT '$.Id',
        Category VARCHAR(100),
        CategoryName VARCHAR(100) '$.Name'
    ) c

您还可以从CROSS APPLY中的对象中选择嵌套属性。假设您的BookCategory还包含一个位置:

{ Id: 1, Name: CA, Category: cs, Location: { Building: Main, Floor: 2, Shelf: 4F }}

您可以包括“建筑物”,例如:

SELECT 
    BookId = b.Id, 
    BookTitle = b.Title,
    c.CategoryId,
    c.Category, 
    c.CategoryName, 
    c.Building
FROM Books b
    CROSS APPLY OPENJSON (b.BookCategory) WITH
    (
        CategoryId INT '$.Id',
        Category VARCHAR(100),
        CategoryName VARCHAR(100) '$.Name',
        Building VARCHAR(100) '$.Location.Building'
    ) c