SQL 쿼리에서 Regex (교체)를 수행하십시오
-
02-07-2019 - |
문제
모든 '<'를 대체하는 가장 좋은 방법은 무엇입니까? <
주어진 데이터베이스 열에서? 기본적으로 수행합니다 s/<[^;]/</gi
메모:
- 작업해야합니다 MS SQL Server 2000
- 반복 가능해야합니다 (그리고 끝나지 않아야합니다
<;;;;;;;;;
)
해결책
일부 해킹이 필요하지만 우리는 이것을 할 수 있습니다 처럼, Patindex, 왼쪽 그리고 오른쪽 그리고 좋은 오래된 문자열 연결.
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
더 나은 것은 이것이 SQL Server 버전이 불가지론이며 잘 작동한다는 것입니다.
다른 팁
다른 물건을 사용하면 이것이 훨씬 깨끗하게 할 수 있다고 생각합니다. :)
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
어때요 :
UPDATE tableName
SET columName = REPLACE(columName , '<', '<')
WHERE columnName LIKE '%lt%'
AND columnName NOT LIKE '%lt;%'
편집하다:
나는 이것이 부분적으로 정확한 열을 무시할 것이라는 것을 깨달았다. <
문자열.
이 경우 WHERE 절의 두 번째 부분을 무시하고 이후에 전화 할 수 있습니다.
UPDATE tableName
SET columName = REPLACE(columName , '<;', '<')
이 기사 SQL 2000 (및 2005 년 간단한 조정)에서 사용할 수있는 간단한 Regex 교체 기능을 만드는 방법을 다루고 있습니다.
MSSQL의 REGEX 풍미가 부정적인 룩 하이드를 지원한다면, 이는 이에 접근하는 올바른 방법 일 것입니다.
s/<(?!;)/</gi
모든 인스턴스를 잡을 것입니다 < 뒤 따르는 것은 아닙니다 ; (아무것도 뒤 따르는 경우에도 [^;] 그리워 할 것입니다.); 성냥의 일부로 캐릭터 대체에서 손실 된 해당 캐릭터의 원래 질문에 대한 의견에 언급 된 문제를 제거합니다.
불행히도, 나는 MSSQL을 사용하지 않으므로 그것이 부정적인 룩보드를 지원하는지 여부를 모르겠습니다 ...
이 패턴에 매우 구체적이지만 과거에는 이와 비슷한 작업을 수행했습니다.
REPLACE(REPLACE(columName, '<', '<'), '<', '<')
더 넓은 예제 (제목 속성에서 부적절 할 수있는 문자 인코딩)
REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
columName
-- Remove existing encoding:
, '&', '&')
, '"', '"')
, ''', '''')
-- Reinstate/Encode:
, '&', '&')
-- Encode:
, '"', '"')
, '''', ''')
, ' ', '%20')
, '<', '%3C')
, '>', '%3E')
, '/', '%2F')
, '\', '%5C')