我有一个表Books
,在SQL Server数据库中有两列Id
,BookCategory
,其中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”。
任何帮助以获得与上表相同的结果。
提前致谢。
答案 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
表示法适用于INTEGER
或VARCHAR
等常规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