1

我想在日誌表上創建一個視圖。很多日誌來自「潛在危險的表單請求」,雖然我有興趣捕獲這些日誌,但它們也產生了很多噪音,所以我想要一個將它們過濾掉的視圖。日誌記錄來自CMS,所以我不能修改它的邏輯。T-SQL中的字符串模式匹配

我想篩選出的日誌條目總是在我想要一個where條款,我可以說的東西的

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

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

所以基本上格式

如何以可用於View的查詢的形式完成此操作?我曾嘗試過使用PatIndex,並在SQL中閱讀了一些關於正則表達式的內容,但是我遇到了兩方面的問題。

+0

但''[url]''可以是任意的。這不僅僅是這兩個例子嗎?所有日誌條目的形式是'At ????? (參考^? – 2013-02-26 16:39:48

+0

@馬丁史密斯 - 是的,[url]是任意的,可以是任何東西,但是在字符串的兩個地方都是一樣的 – 2013-02-26 16:47:50

回答

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 + ')' 
+0

非常好。 – 2013-02-26 18:02:57

0

TSQL的通配符是%符號。試試這個:

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

這並不能確保'%'匹配的開始是一樣的字符串作爲匹配的結尾 – 2013-02-26 16:43:31

+0

@馬丁史密斯指責我的頭,我開始了,但遇到了錯誤,它可能是'at [媒體文件]由[url]推薦'。不想丟失這些 – 2013-02-26 16:47:01

+0

好點,我錯過了原始問題中的微妙之處,你可以使用一個標量UDF,但@Martin Smith的交叉應用示例更加簡潔/緊湊。 – tgolisch 2013-02-26 17:16:04