【问题标题】:String pattern matching in T-SQLT-SQL 中的字符串模式匹配
【发布时间】:2013-02-12 05:13:51
【问题描述】:

我正在尝试在日志表上创建视图。很多日志来自“潜在危险的表单请求”,虽然我有兴趣捕获这些日志,但它们也会产生很多噪音,所以我希望有一个可以过滤掉它们的视图。日志记录来自 CMS,因此我无法修改其逻辑。

我要过滤掉的日志条目是 always,格式为

At /contact-us.aspx (Referred by: http://www.mydomain.com/contact-us.aspx): 
At /login.aspx (Referred by: http://www.mydomain.com/login.aspx): 

所以基本上我想要一个where 子句,在那里我可以说一些大意的东西

where logComment <> 'At [url] (Referred by: http://www.mydomain.com[url]);'

如何以可用于视图的查询的形式完成此操作?我曾尝试玩弄PatIndex 并阅读了一些关于 SQL 中的正则表达式的信息,但我都遇到了死胡同。

【问题讨论】:

  • 但是[url] 可以是任意的。大概不只是那里的两个例子?所有的日志条目都是At ???? (Referred形式的吗?
  • @Martin Smith - 是的,[url] 是任意的。可以是任何东西,但在字符串中的两个位置都相同。

标签: sql-server tsql sql-server-2005 pattern-matching string-matching


【解决方案1】:

TSQL 的通配符是 % 符号。试试这个:

WHERE logComment NOT LIKE 'At % (Referred by: http://www.mydomain.com%);'

【讨论】:

  • 这并不能确保开头匹配的%与结尾匹配的字符串相同。
  • @Martin Smith 一针见血。我从那个开始,但遇到了可能是At [media file] Referred by [url] 的错误。不想失去那些。
  • 好点。我错过了原始问题中的微妙之处。您可以使用标量 UDF,但 @Martin Smith 的交叉应用示例更简洁/紧凑。
【解决方案2】:

这应该返回与'At % (Referred%' 模式完全不匹配或与问题中指定的模式不匹配的任何内容。

WITH Log(logComment)
     AS (SELECT 'At /contact-us.aspx (Referred by: http://www.mydomain.com/contact-us.aspx)'
         UNION ALL
         SELECT 'At /login.aspx (Referred by: http://www.mydomain.com/login.aspx)'
         UNION ALL
         SELECT 'FOOBAR')
SELECT logComment
FROM   Log
       CROSS APPLY (SELECT 
                    CASE
                    WHEN logComment LIKE 'At % (Referred%' 
                    THEN SUBSTRING(logComment, 4, CHARINDEX('(Referred', logComment) - 5)
                    END) C(url)
WHERE  url IS NULL
        OR logComment <> 'At ' + url + ' (Referred by: http://www.mydomain.com' + url + ')' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多