SQL Server:用萬用字元替換?
replace
Microsoft SQL Server 本身是否支持使用萬用字元的某種功能?我收集到正則表達式本身不可用。我注意到有一個
PATINDEX
函式可以用來組合一個解決方案——有沒有更簡單的方法?例如
REPLACE(data,'[xy]','q')
替換x
或。y
_q
REPLACE
內置函式不支持模式或萬用字元;只做。LIKE
_PATINDEX
假設您真的只想要問題中所示的簡單單字元替換,那麼您可以呼叫
REPLACE
兩次,一個嵌套在另一個中,如下所示:SELECT REPLACE( REPLACE('A B x 3 y Z x 943 yy!', 'x', 'q'), 'y', 'q');
回報:
A B q 3 q Z q 943 qq!
如果您確實需要更複雜的模式匹配/替換,那麼您將需要通過正則表達式來完成,這只能通過 SQLCLR 完成。SQL# SQLCLR 庫(我編寫的)的免費版本中提供了幾個 SQLCLR RegEx 函式,其中之一是
RegEx_Replace[4k]()
(該4k
版本適用於您確定永遠不需要超過 4000 個字元的情況,因此您可以變得更好不用NVARCHAR(MAX)
作輸入參數或返回值的性能)。兩個嵌套
REPLACE
呼叫的等效項將按如下方式完成(並使用問題中顯示的模式語法):SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z x 943 yy!', N'[xy]', N'q', -1, 1, NULL);
回報:
A B q 3 q Z q 943 qq!
但是,由於我們正在討論一種更複雜的模式的可能性,這種模式在 T-SQL 中無法輕鬆完成,我們可以在模式上使用量詞,讓它用單個替換任意數量的連續字元
x
或字元:y``q
SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z xx 943 yyxxyxy!', N'[xy]+', N'q', -1, 1, NULL);
回報:
A B q 3 q Z q 943 q!
請注意,輸入字元串與前兩個範例略有不同,在
x
之後添加了額外內容,並在末尾Z
添加了額外內容。而且,在這兩種情況下,多字元片段都被替換為單個.xxyxy``yy``q
有關使用字元串和排序規則的更多資訊,請訪問:排序規則資訊
這篇文章:https ://stackoverflow.com/questions/13253259/sql-server-replace-command-with-wildcard似乎非常相似,並引用了這個連結:https ://stackoverflow.com/questions/150977/perform-regex-替換-in-an-sql-query
另一種選擇是
UPDATE myTable SET myField = LEFT(myField, PATINDEX('%Z%', myField)) WHERE myField LIKE '%X%' OR myField LIKE '%Y%'