2014-11-14 2 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 

OR

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

Perfect !! Это то, что я искал. Спасибо, варчар. Теперь я могу расширить эту форму, чтобы выбрать пару old-val, new-val из другой таблицы (например, sample_1, которая имеет эти два столбца и каждое значение уникально). Конечная цель - заменить все старое значение в «образце» таблицы, выбирая новое значение из таблицы sample_1. Я думаю, чтобы получить все пары сопоставления старого и нового значений в качестве hstore и затем соответствующим образом закольцовать его в запросе «Обновить». Это прекрасно, или у вас есть лучшее предложение? – akhi

0

UPDATE не работает таким образом. Вам нужно указать каждый из столбцов, которые вы хотите изменить, с помощью выражений column = value, разделенных запятой.

т.е.

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

Вот больше информации о UPDATE, в том числе грамматики.

+0

Да, это, вероятно, ограничение в обновлении, чтобы указать имя столбца. Я хотел знать экспертные взгляды, как будто есть какой-то сложный способ достичь этого, не указав имя столбца, что облегчит мою задачу. – akhi

+0

Вы можете динамически генерировать SQL, как упомянули два других ответа, но я не уверен, что получаю случай использования, который вы ищете. Вы хотите установить * все * столбцы в таблице на то же самое значение? – khampson

0

Вам нужно будет написать код. Вам нужно получить имена всех таблиц и все имена, которые являются текстуальными:

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; 

и затем для каждой комбинации таблицы/столбца, построить запрос, чтобы сделать замену:

myQuery = "update " + table_name + 
    " set " + column_name + " = replace(" + column_name + 
    ", 'old_val', 'new_val')" 

... и затем выполнить запрос на любом языке, который вы используете. Вы можете написать это в plpgsql, но серьезно, не надо. Это действительно опасный фрагмент кода.

Если вы смотрите на этом для Wordpress или Drupal-сайта, посетить эти ребята: https://interconnectit.com/products/search-and-replace-for-wordpress-databases/

+0

К сожалению, я воспринимал это как значение для всех таблиц, а не только для одной таблицы. Вы можете изменить первый запрос выше, чтобы включить «where table_name = 'mytable», если хотите. –