2010-06-16 58 views
4
的具體模式

是否有可能使用像在SQL查詢來尋找數字和字母組成的圖案。我需要找到特定字段數據具有模式的所有記錄(2個數字,1個連字符,3個字母)## - AAA我使用SQL Server 2008的SSMS。任何幫助將不勝感激。謝謝。創建SQL「LIKE」 Statment,看起來數字和字母

+0

我想你會需要的正則表達式。 Oracle有一個'REGEXP_LIKE'函數,就像使用'LIKE'一樣,但是有一個正則表達式。不幸的是,我不認爲MS SQL Server有類似的功能,所以我認爲你可能需要編寫一個程序來幫助。 – FrustratedWithFormsDesigner 2010-06-16 15:35:54

回答

10

我覺得LIKE '%[0-9][0-9]-[A-Z][A-Z][A-Z]%'應該工作。

我不知道的情況下,你的靈敏度要求,但你可以在下面貼COLLATE。

select * from 
(
SELECT 'GHSASKJK' AS T UNION ALL 
SELECT 'HGGH11-ABC' UNION ALL 
SELECT 'HGGH11-abc' 
) f 
WHERE T LIKE '%[0-9][0-9]-[A-Z][A-Z][A-Z]%' COLLATE Latin1_General_CS_AS 
+0

完美。這種情況沒有區分大小寫的情況,但我很欣賞將來使用的信息。謝謝。 – user234872 2010-06-16 16:43:53

2

我會建議創建與.net一個CLR程序集。這樣你可以創建一個可以使用正則表達式的函數或SP。

http://www.simple-talk.com/sql/t-sql-programming/clr-assembly-regex-functions-for-sql-server-by-example/

編輯:儘管這可以通過像做在其他的答案說,我還是會建議建立組裝。如果由於某種原因,你的數據的變化,你需要仰視數據的先進方式,這正則表達式組合將能夠適應變化

+1

使用CLR正則表達式對此非常矯枉過正。另外,如果可能的話,使用'LIKE'通常會快得多,因爲它是SQL Server本地的,並且可以更好地使用索引(如果您可以阻止最初的'%'或'_')。 – Ruben 2010-06-16 15:44:22

+0

有趣。我會研究這個以備將來使用。謝謝 – user234872 2010-06-16 19:02:32

4

如果數據正好是「## - AAA」,那麼您可以使用LIKE '[0-9][0-9]-[A-Z][A-Z][A-Z]'。如果數據在某個地方包含此序列,請使用LIKE '%[0-9][0-9]-[A-Z][A-Z][A-Z]%'

請注意,如果您的列索引,LIKE '[0-9][0-9]-[A-Z][A-Z][A-Z]'可以很多比任何UFD或CLR正則表達式更快,因爲SQL Server可以理解LIKE更好,它可以更容易地跳過指標的部分,如果它永遠不會匹配。例如,所有以0-9以外的字符開頭的記錄都將立即被忽略,而UDF或CLR正則表達式仍將讀取這些值。

6

你也應該能夠PATINDEX做到這一點。

Select * 
From Table 
Where PatIndex('%[0-9][0-9]-[A-Z][A-Z][A-Z]%', Value) > 0 
+0

+1:對於非CLR解決方案 – 2010-06-16 15:43:34

+0

爲什麼'PATINDEX'而不是'LIKE'?使用'LIKE'更可讀,恕我直言。 – Ruben 2010-06-16 15:52:23

+0

@Ruben - 這是針對同一問題的備用非CLR解決方案。 – Thomas 2010-06-16 16:14:12

2

您應該可以使用類似的搜索。你的where子句將類似於:

Where YourColumnName Like '%[0-9][0-9]-[a-z][a-z][a-z]%' 

***這是假設的情況下,大小寫排序