postgresql-텍스트 필드 내에서 문자열의 모든 인스턴스를 교체


답변:


404

postgresql의 replace 함수 를 사용하고 싶습니다 :

replace(string text, from text, to text)

예를 들어 :

UPDATE <table> SET <field> = replace(<field>, 'cat', 'dog')

그러나 이것은 문자열을 문자열로 바꾸는 것이므로 '범주'는 '독점'이 될 것입니다. regexp_replace 함수는 대체하려는 항목에 대해보다 엄격한 일치 패턴을 정의하는 데 도움이 될 수 있습니다.


4
안녕하세요 여러분의 답변과 설명이 마음에 듭니다. 정말 도움이됩니다. regexp_replace를 사용하여 예제를 추가 할 수 있습니까? 감사!
Wim Feijen

1
세분성을 높이기 위해 다음을 사용할 수 있습니다regexp_replace
drs

83

정규 표현 방식

보다 엄격한 대체 일치가 필요한 경우 PostgreSQL의 regexp_replace함수는 POSIX 정규식 패턴을 사용하여 일치시킬 수 있습니다. regexp_replace (source, pattern, replacement [, flags]) 구문이 있습니다 .

플래그 ig대소 문자를 구분하지 않고 전역 일치에 각각 사용합니다. 또한 사용 \m하고 \M각각 시작과 단어의 끝과 일치 할 수 있습니다.

정규식 대체를 수행 할 때는 대개 몇 가지 문제가 있습니다. 고양이개로 바꾸는 것이 얼마나 쉬운 지 봅시다 .

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog');
-->                    Cat bobdog cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'i');
-->                    dog bobcat cat cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'g');
-->                    Cat bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat', 'dog', 'gi');
-->                    dog bobdog dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat', 'dog', 'gi');
-->                    dog bobcat dog dogs dogfish

SELECT regexp_replace('Cat bobcat cat cats catfish', 'cat\M', 'dog', 'gi');
-->                    dog bobdog dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat\M', 'dog', 'gi');
-->                    dog bobcat dog cats catfish

SELECT regexp_replace('Cat bobcat cat cats catfish', '\mcat(s?)\M', 'dog\1', 'gi');
-->                    dog bobcat dog dogs catfish

그 후에도 적어도 하나의 미해결 상태가 있습니다. 예를 들어, "Cat"로 시작하는 문장은 문장 대문자를 깨뜨리는 소문자 "dog"으로 대체됩니다.

자세한 내용 은 현재 PostgreSQL 패턴 일치 문서를 확인 하십시오.

대체 텍스트로 전체 열 업데이트

내 예제를 고려할 때 가장 안전한 옵션은 다음과 같습니다.

UPDATE table SET field = regexp_replace(field, '\mcat\M', 'dog', 'gi');

30

당신은 replace기능을 사용할 수 있습니다

UPDATE your_table SET field = REPLACE(your_field, 'cat','dog')

함수 정의는 다음과 같습니다 ( 여기 에서 가져옴 ).

replace(string text, from text, to text)

수정 된 텍스트를 반환합니다. 이 SQL 바이올린을 확인할 수도 있습니다 .


0

다음은 정규식을 사용하여 열에있는 하나 이상의 공백 문자의 모든 인스턴스를 밑줄로 바꾸는 예입니다.

select distinct on (pd)
regexp_replace(rndc.pd, '\\s+', '_','g') as pd
from rndc14_ndc_mstr rndc;

"s"전에 하나의 백 슬래쉬 만 필요하다고 생각합니다
Marty Neal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.