web-dev-qa-db-ja.com

SQL Server:ワイルドカードで置き換えますか?

Microsoft SQL Serverは、ワイルドカードを使用して何らかのreplace関数をネイティブでサポートしていますか?正規表現がネイティブで利用できないことを収集します。

ソリューションを結合するために使用できるPATINDEX関数があることに注意してください。もっと簡単にできることはありますか?

たとえば、xまたはyqに置き換えるには、REPLACE(data,'[xy]','q')を使用します。

7
Manngo

REPLACE組み込み関数は、パターンまたはワイルドカードをサポートしていません。 LIKEPATINDEXのみが行います。

質問に示されているように本当に単純な単一文字の置換が本当に必要であると仮定すると、次のように、REPLACEを2回呼び出すことができます。

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関数を使用できます。そのうちの1つはRegEx_Replace[4k]()です(4kバージョンは、 4000文字を超える文字は必要ないため、NVARCHAR(MAX)を入力パラメーターまたは戻り値として使用しないことで、パフォーマンスを向上させることができます。

ネストされた2つの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!

入力文字列が前の2つの例から少し変更されて、xの後にZを追加し、最後にxxyxyyyに追加することに注意してください。また、どちらの場合も、複数文字のフラグメントは単一のqに置き換えられました。

文字列と照合の操作の詳細については、次のサイトをご覧ください。 照合情報

3
Solomon Rutzky

上記のCaMからの回答はポスターの質問には回答しませんが、エクスポートパスを標準化する必要がある状況で役立ちました(エクスポートパスはD:\ mypath E:\ mypathまたは10.10.10.128\C $ \の場合があります) mypath etc ...)多分それは他の誰かを助けるでしょう

-- standardize output paths
UPDATE dbo.ELDPdf
 SET OutputPath = SUBSTRING(OutputPath, PATINDEX('%$%', OutputPath)+2,1000)
 WHERE JobSummaryId = @JobSummaryId
 AND OutputPath LIKE '%$%'

UPDATE dbo.ELDPdf
 SET OutputPath = SUBSTRING(OutputPath, PATINDEX('%:%', OutputPath)+2,1000)
 WHERE JobSummaryId = @JobSummaryId
 AND OutputPath LIKE '%:\%'
0
Richard Varno

この投稿: https://stackoverflow.com/questions/13253259/sql-server-replace-command-with-wildcard はかなり似ているようで、このリンクを参照しています: https:// stackoverflow .com/questions/150977/perform-regex-replace-in-an-sql-query

別のオプションは次のようなものです

 UPDATE myTable
 SET myField = LEFT(myField, PATINDEX('%Z%', myField))
 WHERE myField LIKE '%X%'
 OR  myField LIKE '%Y%'
0
CaM