检查 JSON 是否包含 属性
Check if JSON contains a property
我正在阅读microsoft docs ms sql JSON options
我想检查我的列 Settings
是否是 nvarchar,我在那里放了一些 JSON,如果那个 JSON 包含 属性 name
.
可行吗?
类似于:
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'
IF (ISJSON(@info) > 0)
BEGIN
-- if (@info contains `$.name`)
--begin
-- SET @info=JSON_MODIFY(@info,'$.name','Mike')
--end
-- else
--begin
-- SET @info=JSON_MODIFY(@info,'$.name','Mike')
--end
END
我需要检查 JSON 属性 是否存在,如果存在则更新值,如果不存在则插入具有预定义值的 属性。
如何插入或更新key: value
对:
如果你想 " ...检查 JSON 属性 是否存在,如果存在则更新值,如果不存在则插入 属性使用预定义值...",JSON_MODIFY
文档中的 remarks 部分为您提供了一种可能的解决方案:
The JSON_MODIFY function lets you either update the value of an
existing property, insert a new key:value pair, or delete a key based
on a combination of modes and provided values.
如果您执行 JSON_MODIFY
而不是 NULL
值,在 lax
模式下,该函数将尝试:
- 如果指定的
path
不存在,则插入一个新的 key:value
对。
- 如果指定的
path
存在,则更新现有的 key: value
对。
Table:
CREATE TABLE #Data (
Settings nvarchar(100)
)
INSERT INTO #Data
(Settings)
VALUES
(N'{"name":"John","skills":["C#","SQL"]}')
声明:
-- Update existing key
UPDATE #Data
SET Settings = JSON_MODIFY(Settings, 'lax $.name', 'Mike')
WHERE ISJSON(Settings) = 1
-- Insert new key
UPDATE #Data
SET Settings = JSON_MODIFY(Settings, 'lax $.day', 'Sunday')
WHERE ISJSON(Settings) = 1
输出:
SELECT *
FROM #Data
Settings
{"name":"Mike","skills":["C#","SQL"],"day":"Sunday"}
如何检查特定的 key
或 value
:
如果要检查特定 key
是否存在,请使用 OPENJSON()
:
SELECT *
FROM #Data d
CROSS APPLY OPENJSON(d.Settings) j
WHERE j.[key] = 'name'
如果要检查特定 value
是否存在,请使用 JSON_VALUE()
:
SELECT *
FROM #Data
WHERE JSON_VALUE(Settings, '$.name') = 'Mike'
问题陈述示例:
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'
IF (ISJSON(@info) > 0) BEGIN
IF EXISTS(SELECT 1 FROM OPENJSON(@info) WHERE [key] = 'name') PRINT 'Yes'
ELSE PRINT 'No'
END
我正在阅读microsoft docs ms sql JSON options
我想检查我的列 Settings
是否是 nvarchar,我在那里放了一些 JSON,如果那个 JSON 包含 属性 name
.
可行吗?
类似于:
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'
IF (ISJSON(@info) > 0)
BEGIN
-- if (@info contains `$.name`)
--begin
-- SET @info=JSON_MODIFY(@info,'$.name','Mike')
--end
-- else
--begin
-- SET @info=JSON_MODIFY(@info,'$.name','Mike')
--end
END
我需要检查 JSON 属性 是否存在,如果存在则更新值,如果不存在则插入具有预定义值的 属性。
如何插入或更新key: value
对:
如果你想 " ...检查 JSON 属性 是否存在,如果存在则更新值,如果不存在则插入 属性使用预定义值...",JSON_MODIFY
文档中的 remarks 部分为您提供了一种可能的解决方案:
The JSON_MODIFY function lets you either update the value of an existing property, insert a new key:value pair, or delete a key based on a combination of modes and provided values.
如果您执行 JSON_MODIFY
而不是 NULL
值,在 lax
模式下,该函数将尝试:
- 如果指定的
path
不存在,则插入一个新的key:value
对。 - 如果指定的
path
存在,则更新现有的key: value
对。
Table:
CREATE TABLE #Data (
Settings nvarchar(100)
)
INSERT INTO #Data
(Settings)
VALUES
(N'{"name":"John","skills":["C#","SQL"]}')
声明:
-- Update existing key
UPDATE #Data
SET Settings = JSON_MODIFY(Settings, 'lax $.name', 'Mike')
WHERE ISJSON(Settings) = 1
-- Insert new key
UPDATE #Data
SET Settings = JSON_MODIFY(Settings, 'lax $.day', 'Sunday')
WHERE ISJSON(Settings) = 1
输出:
SELECT *
FROM #Data
Settings
{"name":"Mike","skills":["C#","SQL"],"day":"Sunday"}
如何检查特定的 key
或 value
:
如果要检查特定 key
是否存在,请使用 OPENJSON()
:
SELECT *
FROM #Data d
CROSS APPLY OPENJSON(d.Settings) j
WHERE j.[key] = 'name'
如果要检查特定 value
是否存在,请使用 JSON_VALUE()
:
SELECT *
FROM #Data
WHERE JSON_VALUE(Settings, '$.name') = 'Mike'
问题陈述示例:
DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'
IF (ISJSON(@info) > 0) BEGIN
IF EXISTS(SELECT 1 FROM OPENJSON(@info) WHERE [key] = 'name') PRINT 'Yes'
ELSE PRINT 'No'
END