检查 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"}

如何检查特定的 keyvalue:

如果要检查特定 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