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

MSSQL wildcard for excluding one or more characters

我在 SQL table(MSSQL 服务器)的单个列中存储了一个 json 数组。现在我想使用 LIKE "pattern" 和通配符过滤一些行。存储的对象是这样的:

[{"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 + '[^{}]*%"}%'

谢谢

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

Table:

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 数组的结构。