【问题标题】:Check if JSON contains a property检查 JSON 是否包含属性
【发布时间】:2019-09-13 07:11:12
【问题描述】:

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

【问题讨论】:

  • SSMS 只是一个客户端工具。它不影响查询的运行方式,最新版本是 18.2。我怀疑你的意思是 SQL Server 2017?
  • @PanagiotisKanavos 是的,所以?我没提到 ssms?
  • 至于检查和修改,您可以像更新任何其他数据一样执行此操作 - 不是使用 IF,而是使用 WHERE 中的条件。如果要检查特定属性的存在,则无需先使用 ISJSON。使用JSON_VALUE 并检查其返回值
  • 你使用了我删除的 SSMS、SSMS-2017 标签。

标签: sql json sql-server tsql sql-server-2017


【解决方案1】:

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

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

JSON_MODIFY 函数允许您更新 现有属性,插入新的键:值对,或删除基于键的 结合模式和提供的值。

如果你执行JSON_MODIFY而不带NULL值,在lax模式下,函数会尝试:

  • 如果指定的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"}

如何检查特定的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

【讨论】:

  • 您检查了格式为 JSON 的 ISJSON,但是如何检查 JSON 中是否已经存在属性 name?如果已经存在,我不想插入另一个属性name。
  • @Stefan0309 JSON_MODIFY 不会在 JSON 文本中附加另一个 name 属性。如果键存在,它将覆盖该值,或者使用新值附加一个新键。
  • 这对我帮助很大!要使用 OPENJSON 运行版本,我需要通过运行 "ALTER DATABASE "db-name" SET COMPATIBILITY_LEVEL = 130;" 来增加 DB 的兼容性级别在短信中
猜你喜欢
  • 2019-06-27
  • 2016-01-20
  • 1970-01-01
  • 2021-10-30
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多