2014-12-29 3 views
0

Можно ли «найти и заменить» следующим образом?Найти несколько строк и заменить одной строкой в ​​Postgres

UPDATE __table__ SET __column__ = replace(__column__, ' ', '_'); 

Как определить массив строк можно найти (',', ';', ':', ' ') заменить '_'?

+2

Использовать 'regexp_replace' –

+0

@CraigRinger Пробовал это с помощью' '{', ',': ',' '}' 'например, без везения, если вы захотите опубликовать рабочий ответ, я был бы рад принять Это. – John

+0

Если ваши «строки» на самом деле являются одиночными символами, как показано на рисунке, не используйте для этого 'regexp_replace()', это будет дороже и сложнее, чем необходимо. –

ответ

1

Прочитайте раздел о Bracket Expressions, который объясняет, как выполнять поиск символов в строке, чтобы заменить

, но это должно работать для вас

UPDATE __table__ SET __column__ = regexp_replace(__column__, E'[\\s,;:]','_','g') 
+0

Это сработало, спасибо! Я удивлен, что они не говорили об этом, чтобы включить «массив», по крайней мере, для обозначения скобки в смысле скобки, хотя, если кто-то задаст этот вопрос, они, по крайней мере, найдут этот Q/A. Спасибо за ссылку на документацию; В таблице 9-16 содержатся сведения о \ s для пробела. – John

2

regexp_replace() мощный, универсальный ... и медленно.

Если вы можете, используйте простой (менее мощный и универсальный) replace(), который намного быстрее.

Для простого случая (замените список одиночных символов другим символом) используйте translate() - еще проще и быстрее. А также гораздо меньше ошибок.

UPDATE tbl 
SET col = translate(col, ',;: ', '____') 
WHERE col <> translate(col, ',;: ', '____'); -- avoid empty updates 

Только обновить строки, которые фактически меняются. Это обычная (возможно, дорогостоящая) ошибка для безошибочного обновления всех строк. Реквизиты:

Обратите внимание, что это только заменяет символ пробела (' ') в то время как класс сокращенная \s в регулярном выражении соответствует всем whitespace characters от класса персонажа [[:space:]].

Смежные вопросы