假定给定的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"}]}}
问题在于它需要索引。如何搜索路径指定的所有数组元素?
答案 0 :(得分:0)
您可以尝试使用OPENJSON
和WITH
子句(以指定列及其类型),然后搜索所有元素:
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)
path或JSON_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';