在名为Subjects
的SQL Server数据库中,我有一个表PublicRelations
和一个列Students
。
[
{ "Label": "Name", "ColumnValue": "Trudie" },
{ "Label": "Class", "ColumnValue": "PublicRelations" },
{ "Label": "Room", "ColumnValue": "8049" },
{ "Label": "HttpPath", "ColumnValue": "https://www.google.com/" }
]
当我使用Json_value
运行下面的查询时,我只得到NULL
。我想让它显示数组中的值。我相信这可能与4000个字符的限制有关?
SELECT [StuduentID],
[Students],
--JSON_VALUE([Students],'$.ColumnValue') AS Name --Only returns NULL
FROM [Subjects].[dbo].[PublicRelations] c
CROSS APPLY OPENJSON(c.Students)
WITH ( Name int '$.Name',
Value nvarchar(255) '$.ColmunValue'
) AS jsonValues
WHERE jsonValues.ColumnValue = 'Trudie'
查询有效,我可以找到我需要的东西,但同样,只有当我想在结果中显示JSON列的那部分时,我才会得到NULL
。
该语句是错误的,您有以下问题(正如@MartinSmith已经提到的(:
- 语法错误-
'$.ColmunValue'
应为'$.ColumnValue'
- 错误的模式定义(
WITH
子句(-我在输入JSON中看不到Name
键 - 错误使用JSON_VALUE((-此函数从JSON字符串中提取标量值,因此
JSON_VALUE([Students],'$.ColumnValue')
在lax
模式下使用此JSON输入返回NULL
您可以尝试使用以下语句(基于问题中的语句(:
表:
CREATE TABLE PublicRelations (
StudentID int,
Students nvarchar(1000))
INSERT INTO PublicRelations (StudentID, Students)
VALUES (1, N'[
{ "Label": "Name", "ColumnValue": "Trudie" },
{ "Label": "Class", "ColumnValue": "PublicRelations" },
{ "Label": "Room", "ColumnValue": "8049" },
{ "Label": "HttpPath", "ColumnValue": "https://www.google.com/" }
]')
声明:
SELECT p.StudentID, j.*
FROM [PublicRelations] p
CROSS APPLY OPENJSON(p.Students) WITH (
Name nvarchar(50) '$.Label',
Value nvarchar(255) '$.ColumnValue'
) j
WHERE EXISTS (
SELECT 1
FROM OPENJSON(p.Students) WITH (Value nvarchar(255) '$.ColumnValue')
WHERE Value = N'Trudie'
) AND (j.Name IN ('Name', 'Class', 'Room'))
结果:
StudentID Name Value
1 Name Trudie
1 Class PublicRelations
1 Room 8049