Sql-Server

SQL Server:用萬用字元替換?

  • April 24, 2019

replaceMicrosoft 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%'

引用自:https://dba.stackexchange.com/questions/162816