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

问题描述 投票:0回答:3

我在 SQL Server 数据库中有一个表

Books
,其中包含两列
Id
BookCategory
,其中
Id
是主键,
BookCategory
包含 JSON 对象。

这是我的桌子书籍

我正在尝试仅将表

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”。

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

提前致谢。

sql sql-server json
3个回答
37
投票

应该是

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

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

您需要使用特殊函数在 SQL 中处理 JSON(MS-SQL 2016 支持 JSON)。

Table.column
表示法适用于常规 SQL 列类型,例如
INTEGER
VARCHAR
等。


2
投票

您可以使用

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

0
投票

--从sql server中的Json对象中获取任意键的值 --在下面的查询中:OrderNumber 是我需要提取值的键,sq.JSON 是我从 sq 表中获取的列名称。

查询:

选择 替换(SUBSTRING(sq.JSON,
CHARINDEX('"订单号":', sq.JSON) + LEN('"订单号":') + 1,
CHARINDEX('"', sq.JSON, CHARINDEX('"订单号":', sq.JSON) + LEN('"订单号":')) -
(CHARINDEX('"订单号":', sq.JSON) + LEN('"订单号":')+1)+
CHARINDEX('"', sq.JSON, CHARINDEX('"订单号":', sq.JSON) + LEN('"订单号":') + 2) -
(CHARINDEX('"订单号":', sq.JSON) + LEN('"订单号":'))
),'"','') 作为 ServiceOrder sq

中的 'CustomerOrderNumber'
© www.soinside.com 2019 - 2024. All rights reserved.