2010-07-15 86 views
7

是否有一種很好的方法將正則表達式轉換爲函數(MSSQL)內的LIKE? 的存儲過程並不比這個複雜得多:Sql喜歡正則表達式

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

該組不會在等一起使用,他們在那裏用於其他用途。

我想後期使用一個存儲過程中,如:

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

凡正則表達式是[表]

+1

你想完成什麼?某些基於表格的調度機制,其規則表達爲正則表達式? ...只是好奇,如果我猜對了。 – 2010-07-15 12:48:24

+0

我會假設解析日誌文件。這看起來像一個查詢字符串。 – 2010-07-15 12:55:02

+0

Tomek是正確的:) – Andreas 2010-07-15 19:20:56

回答

4

可以使用CLR函數將正則表達式解析添加到S​​QL服務器。這從SQL 2005及更高版本中是可能的。一個很好的例子見here

+0

最後從他們得到的答案,應該工作正常..謝謝。即使你的回答沒有完全回答我的問題,但它解決了我的問題。所以我將其標記爲已解決:) – Andreas 2010-07-18 19:02:38

+1

雖然此鏈接可能回答問題,但最好在此處包含答案的基本部分,並提供該鏈接供參考。如果鏈接頁面更改,則僅鏈接答案可能會失效 – Moes 2015-03-26 01:52:23

3

檢查SQL的這種功能的一部分。它可以幫助你實現你的任務:PATINDEX('%[^0-9\.]%',@Input)

PATINDEX (Transact-SQL)

+0

有沒有辦法告訴函數表達式的多個實例,如正則表達式:s「+」或「*」。 例如PATINDEX('%[a-c] +%',@輸入) – Andreas 2010-07-15 20:23:48

+0

不,我不認爲它可能 – 2010-07-16 07:00:19

1

不開箱。在SQL Server中最接近正則表達式的搜索是PATINDEX(),但它不會執行正則表達式。

如果你真的想這樣做,你必須做一個CLR函數來運行正則表達式。你可能會擔心速度,但我會說幾乎沒有你會做的任何涉及正則表達式或模式的東西都可以使用索引。

2

這將在大型表上運行非常慢,解析每一行上的字符串列。

如果您可以更改表格,將字符串列拆分成不同的列可能會更好,因此您可以使用更傳統的WHERE country=... AND sessionid=...,您甚至可以通過這種方式添加和使用索引。

4

我想像

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

可能是足夠接近?如果目的只是爲了帶回非空白國家和會話ID值的記錄。

如果列中的值不一定以'country'開頭,那麼您必須使用WHERE col LIKE '%country=[A-Za-z0-9]%&sessionid=[A-Za-z0-9]%',這可能會大大減慢KM的答案。

1

使用免費的SQL#範圍內的RegEx功能。這種方法我沒有任何性能問題。