T-SQL中的字符串模式匹配

时间:2013-02-26 16:36:46

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

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

我要过滤的日志条目始终格式为

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]);'

如何以可用于View的查询形式完成此操作?我尝试过使用PatIndex并在SQL中阅读一些关于Regex的内容,但是我在两者中都遇到了死胡同。

2 个答案:

答案 0 :(得分:4)

这应该返回任何与模式'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 + ')' 

答案 1 :(得分:0)

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

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