【问题标题】:MSSQL wildcard for excluding one or more characters用于排除一个或多个字符的 MSSQL 通配符
【发布时间】:2020-04-23 13:39:26
【问题描述】:

我在 SQL 表 (MSSQL Server) 的单个列中存储了一个 json 数组。现在我想使用 LIKE “模式”和通配符过滤一些行。存储的对象是这样的:

[{"id":"W678","value":"282779"},
 {"id":"O891","value":"25896"},
 {"id":"E859","value":"12711"},
 {"id":"M914","value":"31513"}]

例如,我想过滤其 JSON 数组中包含“id”=“W678”元素且值包含“27”的行

在使用正则表达式的情况下,以下正则表达式对我有用:

/.+{"id":"W678","value":"[^{}]*27[^{}]*"}.+/

但我不知道如何将上述正则表达式转换为 SQL 通配符表达式。 我已经尝试过类似的方法,但它不起作用。

LIKE '%{"id":"W678","value":"[^{}]%' + @Value + '[^{}]*%"}%'

谢谢

【问题讨论】:

  • 您使用的是哪个 dbms?
  • @jarlh Sql 服务器
  • 如果您使用的是 SQL Server 2016 或更高版本:Microsoft: JSON data in SQL Server
  • 您的 SQL Server 版本是多少?
  • @Zhorov Sql Server 2016

标签: sql json sql-server wildcard


【解决方案1】:

一种可能的方法是解析 JSON 数组并使用 OPENJSON()WITH 子句中的显式模式将其内容作为表返回。然后,使用基于集合的方法,您可以过滤内容并找到匹配的行。

表:

CREATE TABLE Data (JsonData varchar(1000))
INSERT INTO Data (JsonData) 
VALUES ('[
   {"id":"W678","value":"282779"},
   {"id":"O891","value":"25896"},
   {"id":"E859","value":"12711"},
   {"id":"M914","value":"31513"}
 ]')

声明:

 SELECT d.*
 FROM Data d
 CROSS APPLY (
    SELECT *
    FROM OPENJSON (d.JsonData) WITH (
       id varchar(4) '$.id',
       value varchar(6) '$.value'
    )
    WHERE [id] = 'W678' AND [value] LIKE  '%27%'
 ) a

请注意,显式架构定义取决于 JSON 数组的结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多