Sql Server 2016 中 json 数据的 Where 子句
Where clause on json data in Sql Server 2016
我的 table 中有一个 nvarchar(1000) 字段,我正在该列中存储 JSON 数据。
例如:
CONTENT_RULE_ID CONTENT_RULE
1 {"EntityType":"Inquiry", "Values":[1,2]}
2 {"EntityType":"Inquiry", "Values":[1,3]}
3 {"EntityType":"Inquiry", "Values":[2,4]}
4 {"EntityType":"Inquiry", "Values":[5,6,1]}
6 {"EntityType":"Inquiry", "Values":[8,1]}
8 {"EntityType":"Inquiry", "Values":[10,12,11]}
从这个我怎样才能得到所有 CONTENT_RULE_ID 在 sql server
中使用 JSON_QUERY 查询 ID 1
@Harisyam,你能试试下面的查询吗
declare @val int = 1
;with cte as (
select *
from CONTENT_RULES
cross apply openjson (CONTENT_RULE, '$')
), list as (
select
CONTENT_RULE_ID, replace(replace([value],'[',''),']','') as [value]
from cte
where CONTENT_RULE_ID in (
select CONTENT_RULE_ID
from cte
where [key] = 'EntityType' and [value] = 'Inquiry'
)
and [key] = 'Values'
)
select
CONTENT_RULE_ID, s.value
from list
cross apply string_split([value],',') s
where s.value = @val
我用SQLstring_split function一个一个获取查询值
输出是
第二个查询可以在一个之后
select
CONTENT_RULE_ID
from CONTENT_RULES
cross apply openjson (CONTENT_RULE, '$')
where replace(replace(value,'[',','),']',',') like '%,1,%'
也许需要 OpenJSON 支持的最完整的 SQL 查询如下
select
content_rule_id,
[value]
from Content as c
cross apply openjson(c.CONTENT_RULE, '$') with (
EntityType nvarchar(100),
[Values] nvarchar(max) as json
) as e
cross apply openjson([Values], '$') as v
sql服务器2016可以开启JSON.
试试这个:
SELECT c.content_rule_ID, y.[key], y.[value]
FROM content_rules AS c
CROSS APPLY OPENJSON(JSON_QUERY(content_rule, '$.content_rule')) AS x
CROSS APPLY OPENJSON(x.[Values], '$') AS y
where y.[value] = 1
and x.[EntityType] = 'Inquiry';
SELECT c.*
FROM CONTENT_RULES AS c
CROSS APPLY OPENJSON(JSON_QUERY(content_rule, '$')) AS x
CROSS APPLY OPENJSON(x.[Value], '$') AS y
where x.[key]='Values' and y.[value]=1
我的情况类似,但我的不是整数数组,而是复杂类型的数组。这是我的代码基于 David Browne's solution
SELECT *
FROM TableName AS T
WHERE EXISTS
(
SELECT *
FROM OPENJSON(T.JsonColumn, '$.Details')
WITH
(
OrderNumber VARCHAR(200) '$.OrderNumber',
Quantity INT '$.Quantity'
)
WHERE OrderNumber = '1234567'
);
你的情况:
SELECT C.*
FROM CONTENT_RULES AS C
WHERE EXISTS
(
SELECT *
FROM OPENJSON(C.CONTENT_RULE, '$.Values')
WHERE value = 1
);
我的 table 中有一个 nvarchar(1000) 字段,我正在该列中存储 JSON 数据。
例如:
CONTENT_RULE_ID CONTENT_RULE
1 {"EntityType":"Inquiry", "Values":[1,2]}
2 {"EntityType":"Inquiry", "Values":[1,3]}
3 {"EntityType":"Inquiry", "Values":[2,4]}
4 {"EntityType":"Inquiry", "Values":[5,6,1]}
6 {"EntityType":"Inquiry", "Values":[8,1]}
8 {"EntityType":"Inquiry", "Values":[10,12,11]}
从这个我怎样才能得到所有 CONTENT_RULE_ID 在 sql server
中使用 JSON_QUERY 查询 ID 1@Harisyam,你能试试下面的查询吗
declare @val int = 1
;with cte as (
select *
from CONTENT_RULES
cross apply openjson (CONTENT_RULE, '$')
), list as (
select
CONTENT_RULE_ID, replace(replace([value],'[',''),']','') as [value]
from cte
where CONTENT_RULE_ID in (
select CONTENT_RULE_ID
from cte
where [key] = 'EntityType' and [value] = 'Inquiry'
)
and [key] = 'Values'
)
select
CONTENT_RULE_ID, s.value
from list
cross apply string_split([value],',') s
where s.value = @val
我用SQLstring_split function一个一个获取查询值
输出是
第二个查询可以在一个之后
select
CONTENT_RULE_ID
from CONTENT_RULES
cross apply openjson (CONTENT_RULE, '$')
where replace(replace(value,'[',','),']',',') like '%,1,%'
也许需要 OpenJSON 支持的最完整的 SQL 查询如下
select
content_rule_id,
[value]
from Content as c
cross apply openjson(c.CONTENT_RULE, '$') with (
EntityType nvarchar(100),
[Values] nvarchar(max) as json
) as e
cross apply openjson([Values], '$') as v
sql服务器2016可以开启JSON.
试试这个:
SELECT c.content_rule_ID, y.[key], y.[value]
FROM content_rules AS c
CROSS APPLY OPENJSON(JSON_QUERY(content_rule, '$.content_rule')) AS x
CROSS APPLY OPENJSON(x.[Values], '$') AS y
where y.[value] = 1
and x.[EntityType] = 'Inquiry';
SELECT c.*
FROM CONTENT_RULES AS c
CROSS APPLY OPENJSON(JSON_QUERY(content_rule, '$')) AS x
CROSS APPLY OPENJSON(x.[Value], '$') AS y
where x.[key]='Values' and y.[value]=1
我的情况类似,但我的不是整数数组,而是复杂类型的数组。这是我的代码基于 David Browne's solution
SELECT *
FROM TableName AS T
WHERE EXISTS
(
SELECT *
FROM OPENJSON(T.JsonColumn, '$.Details')
WITH
(
OrderNumber VARCHAR(200) '$.OrderNumber',
Quantity INT '$.Quantity'
)
WHERE OrderNumber = '1234567'
);
你的情况:
SELECT C.*
FROM CONTENT_RULES AS C
WHERE EXISTS
(
SELECT *
FROM OPENJSON(C.CONTENT_RULE, '$.Values')
WHERE value = 1
);