检查JSON是否包含属性

nr9pn0ug  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(175)

我正在阅读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属性是否存在,如果存在,则更新值,如果不存在,则插入具有预定义值的属性。

mgdq6dx1

mgdq6dx11#

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

如果你想……”检查JSON属性是否存在,如果存在,则更新值,如果不存在,则插入具有预定义值的属性..."*,JSON_MODIFY文档中的备注部分为您提供了一个可能的解决方案:
JSON_MODIFY函数允许您更新现有属性的值,插入新的键:值对,或基于模式和提供的值的组合删除键。
如果在lax模式下执行JSON_MODIFY,而不是NULL,则函数将尝试:

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

表:

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

SQL Server 2022新增JSON功能:

从SQL Server 2022开始,您可以使用JSON_PATH_EXISTS()函数来检查指定的JSON路径是否存在:

DECLARE @info NVARCHAR(100)='{"name":"John","skills":["C#","SQL"]}'
IF ISJSON(@info) = 1 BEGIN  
   IF JSON_PATH_EXISTS(@info, '$.name') = 1 PRINT 'Yes'
   ELSE PRINT 'No'
END

相关问题