用于排除一个或多个字符的 MSSQL 通配符

Posted

技术标签:

【中文标题】用于排除一个或多个字符的 MSSQL 通配符【英文标题】:MSSQL wildcard for excluding one or more characters 【发布时间】: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 【参考方案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 数组的结构。

【讨论】:

以上是关于用于排除一个或多个字符的 MSSQL 通配符的主要内容,如果未能解决你的问题,请参考以下文章

通配符

通配符

排除包含字符串'x'的通配符

正则表达式和通配符简介

微软搜索使用多个标准(通配符,排除等)

Elasticsearch上的短语和通配符查询