我在 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”。
任何帮助获得与上表书籍相同的结果。
提前致谢。
应该是
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
等。
您可以使用
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
--从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