it-swarm.com.de

SQL Server: Durch Platzhalter ersetzen?

Unterstützt Microsoft SQL Server nativ eine replace -Funktion mit Platzhaltern? Ich stelle fest, dass reguläre Ausdrücke nicht nativ verfügbar sind.

Ich stelle fest, dass es eine PATINDEX -Funktion gibt, mit der eine Lösung zusammengeschraubt werden kann - gibt es eine, die dies einfacher macht?

Zum Beispiel REPLACE(data,'[xy]','q'), um x oder y durch q zu ersetzen.

7
Manngo

Die integrierte Funktion REPLACE unterstützt keine Muster oder Platzhalter. nur LIKE und PATINDEX tun.

Angenommen, Sie möchten wirklich nur die einfache Ersetzung einzelner Zeichen, wie in der Frage gezeigt, dann können Sie REPLACE zweimal aufrufen, wobei eines in das andere verschachtelt ist, wie folgt:

SELECT REPLACE(
               REPLACE('A B x 3 y Z x 943 yy!',
                       'x',
                       'q'),
               'y',
               'q');

Kehrt zurück:

A B q 3 q Z q 943 qq!

Wenn Sie einen komplexeren Mustervergleich/-austausch benötigen, müssen Sie dies über reguläre Ausdrücke tun, was nur über SQLCLR möglich ist. In der kostenlosen Version der SQL # SQLCLR-Bibliothek (die ich geschrieben habe) sind mehrere SQLCLR-RegEx-Funktionen verfügbar, eine davon ist RegEx_Replace[4k]() (die 4k - Version ist Wenn Sie sicher sind, dass Sie nie mehr als 4000 Zeichen benötigen, können Sie eine bessere Leistung erzielen, wenn Sie NVARCHAR(MAX) nicht als Eingabeparameter oder Rückgabewert verwenden.

Das Äquivalent der beiden verschachtelten REPLACE Aufrufe würde wie folgt ausgeführt (und unter Verwendung der in der Frage gezeigten Mustersyntax):

SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z x 943 yy!', N'[xy]', N'q', -1, 1, NULL);

Kehrt zurück:

A B q 3 q Z q 943 qq!

Da es sich jedoch um die Möglichkeit eines komplexeren Musters handelt, das in T-SQL nicht einfach zu bewerkstelligen ist, können wir einen Quantifizierer für das Muster verwenden, um eine beliebige Anzahl zusammenhängender x oder y Zeichen mit einem einzelnen q:

SELECT SQL#.RegEx_Replace4k(N'A B x 3 y Z xx 943 yyxxyxy!', N'[xy]+', N'q', -1, 1, NULL);

Kehrt zurück:

A B q 3 q Z q 943 q!

Bitte beachten Sie, dass die Eingabezeichenfolge gegenüber den beiden vorherigen Beispielen geringfügig geändert wurde, um ein zusätzliches x nach dem Z und ein zusätzliches xxyxy zum yy am hinzuzufügen Ende. In beiden Fällen wurde das Fragment mit mehreren Zeichen durch ein einzelnes q ersetzt.

Weitere Informationen zum Arbeiten mit Zeichenfolgen und Kollatierungen finden Sie unter: Kollatierungsinfo

3
Solomon Rutzky

Die obige Antwort von CaM, die die Posterfrage nicht beantwortet, hat mir in einer Situation geholfen, in der ich Exportpfade standardisieren musste (wobei der Exportpfad D:\mypath E:\mypath oder 10.10.10.128\C $\sein könnte mypath etc ...) vielleicht hilft es jemand anderem

-- 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

Dieser Beitrag: https://stackoverflow.com/questions/13253259/sql-server-replace-command-with-wildcard scheint ziemlich ähnlich zu sein und verweist auf diesen Link: https: // stackoverflow .com/question/150977/perform-regex-replace-in-an-sql-query

Eine andere Option ist so etwas wie

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