用于排除一个或多个字符的 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 通配符的主要内容,如果未能解决你的问题,请参考以下文章