【问题标题】:Sql Like to RegExSql 喜欢正则表达式
【发布时间】:2011-03-16 09:15:27
【问题描述】:

有没有在函数 (MSSQL) 中将正则表达式转换为 LIKE 的好方法? sproc 没有比这更复杂的了:

(country\=)(?<Country>[\w\d]+)(\&sessionid\=)(?<SessionId>.+)

这些组不会在 LIKE 中使用,它们是用于其他目的的。

我想在存储过程中使用它,比如:

SELECT * FROM [Table]
WHERE test_regex(regex, 'text') = 1

正则表达式是 [Table] 的一部分

【问题讨论】:

  • 你想完成什么?某种基于表的调度机制,其中规则表示为正则表达式? ...只是好奇我是否猜对了。
  • 我会假设解析日志文件。这看起来像一个查询字符串。

标签: sql-server regex function stored-procedures sql-like


【解决方案1】:

检查sql的这个函数。它可以帮助您完成任务:PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

【讨论】:

  • 有没有办法告诉函数一个表达式的多个实例,比如正则表达式:s“+”或“*”。例如 PATINDEX('%[a-c]+%',@Input)
【解决方案2】:

SQL# 中使用免费的 RegEx 功能。这种方法我没有遇到任何性能问题。

【讨论】:

    【解决方案3】:

    我想

    SELECT ...
    FROM [Table]
    WHERE col LIKE 'country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%'
    

    可能足够接近?如果目的只是带回具有非空白国家和会话ID 值的记录。

    如果列中的值不一定以“国家”开头,则必须使用 WHERE col LIKE '%country=[A-Za-z0-9]%&amp;sessionid=[A-Za-z0-9]%',根据 KM 的回答,这可能会大大减慢速度。

    【讨论】:

      【解决方案4】:

      这将在一个大表上运行非常慢,解析每一行的字符串列。

      如果您可以更改表,最好将该字符串列拆分为不同的列,这样您就可以拥有更传统的WHERE country=... AND sessionid=...,您甚至可以通过这种方式添加和使用索引。

      【讨论】:

        【解决方案5】:

        可以使用 CLR 函数将正则表达式解析添加到 SQL 服务器。这在 SQL 2005 及更高版本中是可能的。请参阅 here 了解一个很好的示例。

        【讨论】:

        • 终于得到了他们的答复,应该可以正常工作了。谢谢。即使您的回答不能完全回答我的问题,它也解决了我的问题。所以我将其标记为已解决:)
        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
        【解决方案6】:

        不是开箱即用的。在 SQL Server 中最接近正则表达式搜索的是 PATINDEX(),但它不执行正则表达式。

        如果你真的想要这个,你必须创建一个 CLR 函数来运行正则表达式。您可能会担心速度,但我想说的是,您几乎不会做任何涉及正则表达式或模式的事情都能够使用索引。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多