【发布时间】:2021-05-13 18:47:56
【问题描述】:
我有一个可以在列中包含 JSON 数据的表。我使用 ISJSON() 函数向表中添加了一个计算列,以标记任何不包含有效 JSON 数据的行
CREATE TABLE tbl1 (Id INT IDENTITY(1,1) NOT NULL, Content NVARCHAR(MAX), IsJsonRecord AS ISJSON(Content))
GO
INSERT INTO tbl1 (Content) VALUES ('a'), ('{"name":"asd"}')
GO
现在我有一个视图,可以将 JSON 数据解析为更易读的格式,例如
CREATE VIEW vw1
AS
SELECT Id,
JSON_VALUE(Content, '$."name"') AS Name
FROM tbl1
WHERE IsJsonRecord > 0
当我从视图中选择时,WHERE 子句按预期工作。
SELECT *
FROM vw1
当我使用额外的 where 子句查询视图时,由于 JSON 数据格式不正确(如下所示)而出现错误。
SELECT *
FROM vw1
WHERE [Name] LIKE '%a%'
查询 WHERE 子句似乎应用于不符合视图中已指定的 WHERE 子句的行。
这是预期的行为吗?
我知道该视图已“优化掉”,但我希望查询优化器先将过滤器应用到不同的字段,然后再应用需要对数据进行操作的函数的过滤器。我认为逻辑在某些情况下可能会带来性能优势。
我不太确定如何在视图中容纳 WHERE 子句。我的实际情况比示例复杂得多,我不确定是否可以使用CASE 语句而不是JSON_VALUE 语句来测试视图中的每一列。
有什么建议吗?
【问题讨论】:
-
看起来很奇怪。如果您将
json_value(...)替换为cross apply openjson(...) with (...)构造,错误就会消失,但我一开始就没想到会出现错误。
标签: json sql-server tsql view