【问题标题】:SQL Server wildcard search on jsonjson 上的 SQL Server 通配符搜索
【发布时间】:2014-01-02 19:04:27
【问题描述】:

我有一个 json 存储在 SQL NVARCHAR(MAX) 列中,如下所示:

{ "field1":"value1", "field2":"value2" ...}.

我想对任何字段进行通配符搜索。示例查询可以是:

给我field2 中包含子字符串 ax 的所有行。查询应返回field2 中带有传真、斧头等的记录。

是否可以在不编写 SQLCLR 函数的情况下做到这一点?尝试使用 LIKE 支持的基本正则表达式是徒劳的。

【问题讨论】:

    标签: sql regex json sql-server-2008-r2


    【解决方案1】:
    WHERE json LIKE '%, "field2":"%ax%'
    

    【讨论】:

    • 这不起作用。如果在 field2 之后有一个 field3 与 halifax,则 %ax% 与它匹配。我不想那样。
    • 这没有意义...发布您的 SQL...我的 SQL 在 LIKE 子句中有 field2":",它应该只带回 field2 的匹配项
    • 我修改了 answer LIKE 子句。试试看,应该可以的。
    • 这是一个简单的例子,你可以看到它不起作用: create table foo ( bar nvarchar(max) ) go insert foo values ('{ "field1":"value1", " field2":"fax", "field3":"value3"}') 插入 foo 值 ('{ "field1":"value1", "field2":"boo", "field3":"dax"}') go select * from foo where bar like '%, "field2":"%ax%' go
    • 如上所述,LIKE 搜索条件将毫无用处。您唯一的选择是将CLR 用于正常的RegEx 执行,或者,如果您已经使用CLR,您可以简单地应用所需的JSON 解析。顺便说一句,SQL Server 不支持RegEx(您可以添加 CLR 来支持它们)
    【解决方案2】:

    我可以使用函数 fnSplitJson2 来做到这一点,可以在http://www.sqlservercentral.com/articles/JSON/68128/找到它

        DECLARE json nvarchar(max)
        SELECT json = 
        '{ "field1":"value1"
         , "field2":"fax"
         , "field3":"axe"
         , "field4":"value4"
         }'
    
        SELECT name, value
        FROM dbo.fnSplitJson2(json, NULL)
        WHERE value LIKE '%ax%'
    

    【讨论】:

      【解决方案3】:

      您可以使用JSON Select 执行此操作,如下所示:

      select *
      from your_table
      where dbo.JsonNVarChar450(your_column, 'field2') like '%ax%'
      

      如果你经常做这种比较,你可以索引field2 的值来加快速度,像这样:

      alter table your_table
      add field2 as dbo.JsonNVarChar450(your_column, 'field2') persisted
      
      create index IX_your_table_field2 on your_table(field2) 
      

      披露:我是 JSON Select 的作者,因此我对您使用它很感兴趣 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 2018-08-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        • 2011-07-14
        • 1970-01-01
        相关资源
        最近更新 更多