2014-11-14 6 views
0

내 질문은 아래에 유사하지만, 나는 모든 열을 위해 그것을 대체 할 : 예를 들어전체 테이블에서 문자열을 다른 문자열로 대체하는 가장 좋은 방법은 무엇입니까?

postgresql - replace all instances of a string within text field

- 전체 테이블의 강아지와 고양이의 모든 인스턴스를 교체 (모든 행) 내가

다음 쿼리가 모든 열에 대해 작동 할 것으로 기대합니다 (업데이트 쿼리에서 열 이름을 지정하지 않음).

UPDATE table_name SET information_schema.columns replace (information_schema.columns, 'old_value', 'new_value'); 

실제로 작동하지 않는 것 같습니다.

어떤 제안을 해주시겠습니까 ??

+0

실제로 열 이름을 직접 변경하려고합니까? alter table 쿼리처럼? 아니면 단지 행의 내용입니까? –

+0

열 이름을 변경하고 싶지 않습니다. 행의 내용을 바꾸기 만하면됩니다. – akhi

답변

1
create table sample (s varchar,s1 varchar,s2 varchar,s3 varchar,s4 varchar); 

insert into sample values ('A','A','A','A','A'); 
insert into sample values('AB','AB','A','AB','AB'); 
insert into sample values('A','AB','A','AB','A'); 
insert into sample values('CA','A','A','CA','CA'); 

select * from sample 

을 그리고이

create or replace function f1(_table text,_oldVal text,_newVal text) returns void as 
$$ 
declare 
rw record; 
begin 
for rw in 
    select 'UPDATE '||$1||' SET '||C.COLUMN_NAME||' = REPLACE ('||C.COLUMN_NAME||','''||$2||''','''||$3||'''); ' QRY 
    FROM (select column_name from information_schema.columns where table_schema='public' and table_name =$1)c 
loop 
    EXECUTE rw.QRY; 
end loop; 
end; 
$$language plpgsql 

같은 시도 및 통화

select f1('sample','A','Z') 

select * from sample 

또는

do 
$$ 
declare 
rw record; 
begin 
for rw in 
    select 'UPDATE sample SET '||C.COLUMN_NAME||' = REPLACE ('||C.COLUMN_NAME||',''Z'',''A''); ' QRY 
    FROM (select column_name from information_schema.columns where table_schema='public' and table_name ='sample')c 
loop 
    EXECUTE rw.QRY; 
end loop; 
end; 
$$; 

select * from sample 
+0

완벽한 !! 이것이 제가 찾고 있던 것입니다. 감사합니다 varchar. 이제이 방법을 확장하여 다른 테이블 (예 : sample_1)에서 이전 val, new val 쌍을 선택하면이 두 열이 있고 각 값은 고유합니다. 궁극적 인 목표는 sample_1 테이블에서 새 값을 선택하여 'sample'테이블의 모든 이전 값을 대체하는 것입니다. 모든 이전 - 새로운 값 매핑 쌍을 hstore로 가져 와서 'Update'쿼리에서 적절하게 반복 할 생각입니다. 괜찮습니까? 아니면 더 좋은 제안이 있습니까? – akhi

0

UPDATE 그런 식으로 작동하지 않습니다. column = value 표현식으로 변경하려는 각 열을 쉼표로 구분하여 지정해야합니다. 즉 여기

UPDATE foo 
SET bar = 1, baz = 2 
WHERE bar = 5; 

문법을 포함하여 추가 정보를 약 UPDATE이다.

+0

예, 열 이름을 지정하기위한 업데이트의 제한 일 수 있습니다. 열의 이름을 지정하지 않고도 달성 할 수있는 까다로운 방법이있는 것처럼 전문가의 의견을 알고 싶었 기 때문에 작업이 쉬워졌습니다. – akhi

+0

다른 두 답변에서 언급 한 것처럼 동적으로 SQL을 생성 할 수 있지만 찾고있는 유스 케이스를 얻을 수 있는지 확실하지 않습니다. 테이블의 * 모든 열을 똑같은 값으로 설정 하시겠습니까? – khampson

0

코드를 작성해야합니다.

myQuery = "update " + table_name + 
    " set " + column_name + " = replace(" + column_name + 
    ", 'old_val', 'new_val')" 
: 교체를 만들기 위해 쿼리를 작성, 각 테이블/컬럼 조합에 대한

select distinct table_name, column_name from information_schema.columns 
    where table_schema='public' 
and (data_type like 'char%' or data_type='text') 
order by table_name, column_name; 

다음 : 당신은 모든 테이블의 이름과 텍스트있는 모든 이름을 검색해야합니다

... 그리고 사용중인 언어로 쿼리를 실행하십시오. plpgsql에서 이것을 작성할 수는 있지만, 심각하게는하지 마십시오. 이것은 정말 위험한 코드입니다. 당신은 워드 프레스 또는 드루팔 사이트에이 일을보고있는 경우

,이 사람들을 방문하십시오 https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

+0

죄송하지만, 나는 하나의 테이블뿐만 아니라 모든 테이블에서 그 의미를 취했습니다. 원하는 경우 위의 첫 번째 쿼리를 "where table_name = 'mytable'"을 포함하도록 변경할 수 있습니다. –