sqlserver regulares regular regexp_like query expresiones ejemplo con sql sql-server regex sql-server-2000

regulares - Realice regex(replace) en una consulta SQL



replace con expresiones regulares sql server (5)

Creo que esto se puede hacer mucho más limpio si usas diferente STUFF :)

create table test ( id int identity(1, 1) not null, val varchar(25) not null ) insert into test values (''&lt; <- ok, &lt <- nok'') WHILE 1 = 1 BEGIN UPDATE test SET val = STUFF( val , PATINDEX(''%&lt[^;]%'', val) + 3 , 0 , '';'' ) FROM test WHERE val LIKE ''%&lt[^;]%'' IF @@ROWCOUNT = 0 BREAK END select * from test

¿Cuál es la mejor manera de reemplazar todo ''& lt'' con &lt; en una columna de base de datos dada? Básicamente realizar s/&lt[^;]/&lt;/gi

Notas:

  • debe funcionar en MS SQL Server 2000
  • Debe ser repetible (y no terminar con &lt;;;;;;;;;; )

Hace falta algo de hacking, pero podemos hacerlo con LIKE , PATINDEX , LEFT AND RIGHT y una buena concatenación de cadenas antiguas.

create table test ( id int identity(1, 1) not null, val varchar(25) not null ) insert into test values (''&lt; <- ok, &lt <- nok'') while 1 = 1 begin update test set val = left(val, patindex(''%&lt[^;]%'', val) - 1) + ''&lt;'' + right(val, len(val) - patindex(''%&lt[^;]%'', val) - 2) from test where val like ''%&lt[^;]%'' IF @@ROWCOUNT = 0 BREAK end select * from test

Mejor es que esta es una versión de SQL Server independiente y debería funcionar bien.


Qué tal si:

UPDATE tableName SET columName = REPLACE(columName , ''&lt'', ''&lt;'') WHERE columnName LIKE ''%lt%'' AND columnName NOT LIKE ''%lt;%''

Editar:

Me acabo de dar cuenta de que esto ignorará las columnas con parcialmente correcto &lt; instrumentos de cuerda.

En ese caso, puede ignorar la segunda parte de la cláusula where y llamar a esto después:

UPDATE tableName SET columName = REPLACE(columName , ''&lt;;'', ''&lt;'')


Si el sabor de la expresión regular de MSSQL admite un look-a-look negativo, esa sería la forma correcta de abordar esto.

s/&lt(?!;)/&lt;/gi

capturará todas las instancias de & lt que no sean seguidas por a ; (incluso si no van seguidos de nada, lo que [^;] se perderá) y no captura lo siguiente no ; personaje como parte del partido, eliminando el problema mencionado en los comentarios sobre la pregunta original de que ese personaje se perdió en el reemplazo.

Lamentablemente, no uso MSSQL, así que no tengo idea de si admite negativos o no ...


Este artículo cubre cómo crear una función Regex Replace simple que puede usar en SQL 2000 (y 2005 con ajustes simples) que puede ayudarlo.