【问题标题】:Querying One Dimensional JSON string查询一维 JSON 字符串
【发布时间】:2021-07-05 12:15:33
【问题描述】:

我正在尝试检查一维数组字符串是否像:

[1,2,3,4,5]

包含某个值,例如 4。

我知道对于多维数组,我可以执行以下操作:

JSON_VALUE(columnName, '$.key')

但对于我的生活,我不知道如何搜索无密钥的 json 字符串。

我试过了:

WHERE JSON_VALUE(columnName, '$') = 1
WHERE JSON_VALUE(columnName, '$.') = 1
WHERE 1 IN JSON_VALUE(columnName, '$')
WHERE 1 IN JSON_VALUE(columnName, '$.')

没有任何效果。

【问题讨论】:

  • SQL 2016 - 我拥有的 SQL 版本。
  • 是的 - 我的 MS SQL SERVER 版本是 2016...我觉得我们非常关注一些不值得关注的事情,哈哈。
  • 说到JSON,具体的dbms很重要!
  • 是字符串,可以用like或者charindex吗?
  • 然后做类似... (columnName LIKE ',1,' OR columnName LIKE '[1,' OR columnName LIKE ',1]') .... 看起来像 JSON 函数变得更容易

标签: sql json sql-server sql-server-2016 json-value


【解决方案1】:

假设字符串 '[1,2,3,4,5]' 位于表的列中,您可以使用 EXISTSOPENJSON

SELECT V.YourColumn
FROM (VALUES('[1,2,3,4,5]'),('[7,8,9]'))V(YourColumn)
WHERE EXISTS (SELECT 1
              FROM OPENJSON(V.YourColumn) 
                   WITH (Value int '$') OJ
              WHERE Value = 4);

【讨论】:

  • OPENJSON 在我的 ms sql 版本中不是一个函数。
  • 愚蠢的问题,但为什么需要WITH 行?在 SQL Server 2016 中,无论有无它,这似乎都返回相同的结果。
  • @Brds 实际上 openjson 在 Sql2016 中 - 使用 exists 实际上可以正常工作
  • 这不是“必需的”@EdmCoff ,但我宁愿 OPENJSON 返回一个 int 而不是 nvarchar(MAX) 然后需要隐式转换为 int。跨度>
  • “正如我之前提到的,许多默认安装的 SQL Server 2016 没有可用的 OPENJSON” 默认情况下,SQL Server 2016 实例的兼容级别为 130 @EdmCoff ,所以这个陈述的完全相反是正确的。默认情况下,他们拥有它。只有当有人降低兼容性时才不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
相关资源
最近更新 更多