2015-12-04 4 views
0

Я пытаюсь использовать SELECT regexp_replace(m.*, '[\n\r]+', ' ', 'g'), чтобы удалить возвращаемые каретки и новые строки из моего поля, чтобы создать CSV из моего стола; однако, похоже, что моя версия postgresql (7.4.27) не поддерживает эту функцию.Есть ли эквивалент regexp_replace для postgresql 7.4?

функция REGEXP_REPLACE (члены, "неизвестно", "неизвестно", "неизвестно") не существует

Я также пытался делать это таким образом:

SELECT replace(replace(m.*, '\r', ''), '\n', '') 

функции заменить (члены, «неизвестные», «неизвестные») не существует

Никакая функция не соответствует данным имени и типам аргументов. Возможно, вам придется добавлять явные типы.

или таким образом:

SELECT replace(replace(m.*, chr(13), ''), chr(10), '') 

функция замены (члены, текст, "неизвестно") не существует

и еще есть подобные ошибки.

Как достичь этого, используя другую функцию или решение?

+1

Вы всегда можете обновить. 7.x больше не следует использовать. –

+0

К сожалению, я не могу обновить эту базу данных. – farjam

ответ

1

m.* не имеет смысла, где вы его положили. Она будет работать следующим образом:

SELECT replace(replace(m.some_column, chr(13), ''), chr(10), '') 
FROM tbl m;

Но это просто снимает все «перевод строки» и «возврат каретки» символы полностью вместо того, чтобы заменить каждую строку, состоящую только из этих символов с одним пробелом, как и оригинал. Если это то, что вы хотите, замена одного символа проще и дешевле с translate() - также в древнем пкге 7.4:

SELECT translate(some_column, chr(13) || chr(10), ''); 

Чтобы достичь того, что оригинал regexp_replace() делает (только без бессмысленных m.*), определить единый символ, который не в строке и использовать это как ступеньку. Скажи: ° не всплывал, то:

SELECT replace(replace(replace(
     translate(some_column, chr(13) || chr(10), '°') -- replace with dummy 
     , '°°', '°') -- consolidate to single dummy 
     , '°°', '°') -- repeat as many times as necessary 
     , '°', ' '); -- replace dummy with space 

кажется неуклюжим, и это несовершенно: не удается слишком много последовательных строк. Но это, вероятно, еще быстрее, чем regexp_replace(), даже в современных Postgres, потому что регулярные выражения намного дороже. Опять же, производительность, вероятно, не проблема.

Обновление до современных Postgres и вам это не нужно.