使用SQL Server JSON_VALUE搜索JSON数组

时间:2019-04-10 09:00:57

标签: sql sql-server

假定给定的json对象:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);

SQL Server具有JSON_VALUE函数,可在WHERE子句中使用以与特定的json元素进行匹配,例如

{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}

问题在于它需要索引。如何搜索路径指定的所有数组元素?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用OPENJSONWITH子句(以指定列及其类型),然后搜索所有元素:

DECLARE @json nvarchar(max)
SET @json = '{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}'

SELECT Town
FROM OPENJSON(@json, '$.info.address')
WITH (
   Town nvarchar(100) '$.town'
)
WHERE Town = 'Belgrade'

输出:

------------
Town
------------
Belgrade

如果您的JSON数据在表格列中,则下一种方法也可能会有所帮助:

-- Table
CREATE TABLE #Data (
   Id int,
   JsonData varchar(max)
)
INSERT INTO #Data
   (Id, JsonData)
VALUES 
   (1, N'{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}'),
   (2, N'{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}'),
   (3, N'{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}')


-- Statement
SELECT DISTINCT Id
FROM #Data d
CROSS APPLY (
   SELECT *
   FROM OPENJSON(d.JsonData, '$.info.address')
   WITH (
      Town nvarchar(100) '$.town'
   )
) j   
WHERE (j.Town = 'Belgrade') OR (j.Town = 'Paris')

输出:

-------
Id
-------
1
2
3

答案 1 :(得分:0)

pathJSON_VALUE中的JSON_QUERY不能接受通配符或表达式。您不能写$.info.address[?(@.town='Belgrade')]来搜索特定项目。

这两个函数也都返回字符串,因此您不能使用它们来提取可以查询的内容。您需要使用OPENJSON将JSON字符串转换为行以进行查询,例如:

declare @json nvarchar(2000)='{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}'

select *
from openjson(@json, '$.info.address')
with (town varchar(200) '$.town')
where town='Belgrade'

这使用OPENJSON提取address数组的内容。它将town属性提取为字段,然后在WHERE中使用它。

您可以使用CROSS APPLY将OPENJSON与表列配合使用,例如:

declare @json nvarchar(2000)='{"info":{"address":[{"town":"Belgrade"},{"town":"Paris"},{"town":"Madrid"}]}}'

DECLARE @table TABLE 
(
    id int identity primary key, 
    customer varchar(200),
    locations varchar(2000)
);

INSERT INTO @table (customer,locations)
VALUES ('AAA',@json);

SELECT *
FROM @table t CROSS APPLY OPENJSON(t.locations, '$.info.address')
                            WITH (town varchar(200) '$.town')
WHERE town='Belgrade';