检查 JSON 包含一个属性

Ste*_*309 1 sql sql-server sql-server-2017

我正在阅读microsoft docs ms sql JSON options 我想检查我的列Settings是否为 nvarchar,我在那里放了一些 JSON,以及该 JSON 是否包含 property 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
Run Code Online (Sandbox Code Playgroud)

我需要检查该 JSON 属性是否存在,如果存在则更新值,如果不存在则插入具有预定义值的属性。

Zho*_*rov 8

如何插入或更新key: value对:

如果您想“...检查该 JSON 属性是否存在,如果存在,则只需更新值,如果不存在,则使用预定义值插入该属性...”,文档中的备注部分JSON_MODIFY为您提供了一种可能的解决方案:

JSON_MODIFY 函数可让您更新现有属性的值、插入新的键值对,或根据模式和提供的值的组合删除键。

如果您JSON_MODIFY使用 not NULLvalue执行,则在laxmode 中,该函数将尝试:

  • key:value如果指定的path不存在,则插入一个新对。
  • key: value如果指定的path存在,则更新现有对。

桌子:

CREATE TABLE #Data (
   Settings nvarchar(100)
)
INSERT INTO #Data
   (Settings)
VALUES
   (N'{"name":"John","skills":["C#","SQL"]}')
Run Code Online (Sandbox Code Playgroud)

陈述:

-- 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
Run Code Online (Sandbox Code Playgroud)

输出:

SELECT *
FROM #Data

Settings
{"name":"Mike","skills":["C#","SQL"],"day":"Sunday"}
Run Code Online (Sandbox Code Playgroud)

如何检查特定keyvalue

如果要检查特定的是否key存在,请使用OPENJSON()

SELECT *
FROM #Data d
CROSS APPLY OPENJSON(d.Settings) j
WHERE j.[key] = 'name'
Run Code Online (Sandbox Code Playgroud)

如果要检查特定的是否value存在,请使用JSON_VALUE()

SELECT *
FROM #Data
WHERE JSON_VALUE(Settings, '$.name') = 'Mike'
Run Code Online (Sandbox Code Playgroud)

问题中的陈述示例:

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
Run Code Online (Sandbox Code Playgroud)