Führen Sie regex (Ersetzen) in einer SQL-Abfrage
-
02-07-2019 - |
Frage
Was ist der beste Weg, um all ‚<‘ mit <
in einer bestimmten Datenbankspalte zu ersetzen? Grundsätzlich führen s/<[^;]/</gi
Weitere Informationen:
- muss arbeiten in MS SQL Server 2000
- muss wiederholbar sein (und nicht mit
<;;;;;;;;;
Ende)
Lösung
Einige Hacking erforderlich, aber wir können dies mit LIKE , PATINDEX , links und rechts und den guten alten String-Verkettung.
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
while 1 = 1
begin
update test
set val = left(val, patindex('%<[^;]%', val) - 1) +
'<' +
right(val, len(val) - patindex('%<[^;]%', val) - 2)
from test
where val like '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
end
select * from test
Es ist besser, dass diese SQL Server-Version Agnostiker ist und sollte gut funktionieren.
Andere Tipps
Ich denke, das viel sauberer gemacht werden kann, wenn Sie verschiedene Dinge verwenden:)
create table test
(
id int identity(1, 1) not null,
val varchar(25) not null
)
insert into test values ('< <- ok, < <- nok')
WHILE 1 = 1
BEGIN
UPDATE test SET
val = STUFF( val , PATINDEX('%<[^;]%', val) + 3 , 0 , ';' )
FROM test
WHERE val LIKE '%<[^;]%'
IF @@ROWCOUNT = 0 BREAK
END
select * from test
Wie wäre:
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
Edit:
Ich habe gerade realisiert diese Spalten mit teilweise richtig <
Strings ignoriert.
In diesem Fall können Sie den zweiten Teil der Where-Klausel ignorieren und nennen dies später:
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
diesem Artikel beschreibt, wie eine einfache Regex-Funktion erstellen, ersetzen, die Sie in SQL 2000 (und 2005 mit einfachen zwicken) verwenden können, die Ihnen helfen können.
Wenn MSSQL regex Geschmack negative Vorschau unterstützt, das wäre der richtige Weg, dies zu nähern.
s/<(?!;)/</gi
werden alle Instanzen von fangen < , die befolgt werden nicht durch ein ; (auch wenn sie durch nichts gefolgt sind, die [^;] vermissen würde) und erfasst nicht die folgenden, nicht ;. Charakter als Teil des Spiels, um das Problem in den Kommentaren auf die ursprüngliche Frage dieses Zeichens erwähnt Beseitigung der Ersatz verloren
Leider benutze ich MSSQL nicht, so habe ich keine Ahnung, ob es negative Vorschau unterstützt oder nicht ...
auf dieses Muster sehr spezifisch, aber ich habe dazu in der Vergangenheit getan ähnlich:
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
breiteres Beispiel (codieren Zeichen, die in einem Titel-Attribute ungeeignet sein können)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')