Как убрать возврат каретки и новые строки в Postgresql? - PullRequest
55 голосов
/ 20 октября 2011

All

Я снова застрял, пытаясь получить данные в нужном мне формате. У меня есть текстовое поле, которое выглядит следующим образом.

"Deangelo 001 Deangelo

местное происхождение имени: италия

от американского имени deangelo

значение: ангелов

эмоциональный спектр • он источник радости для всех.

личная неприкосновенность • его доброе имя - его самый ценный актив. личность • с орлами трудно парить, когда тебя окружают индюки! отношения • начинаются медленно, но отношения с Денгело строит со временем. путешествия и отдых • путешествие на всю жизнь в его будущем.

карьера и деньги • одаренный ребенок, Динжело должен быть постоянно оспаривается.

жизненные возможности • радость и счастье ждут этого благословенного человека.

счастливые числа Денгело: 12 • 38 • 18 • 34 • 29 • 16

"

Каким будет лучший способ в Postgresql убрать возврат каретки и новые строки? Я пробовал несколько вещей, и ни одна из них не хочет себя вести.

select regexp_replace(field, E'\r\c', '  ', 'g') from mytable
    WHERE id = 5520805582

SELECT regexp_replace(field, E'[^\(\)\&\/,;\*\:.\>\<[:space:]a-zA-Z0-9-]', ' ')
    FROM mytable
    WHERE field~ E'[^\(\)\&\/,;\*\:.\<\>[:space:]a-zA-Z0-9-]'
    AND id = 5520805582;

Заранее спасибо, Адам

Ответы [ 4 ]

129 голосов
/ 20 октября 2011
select regexp_replace(field, E'[\\n\\r]+', ' ', 'g' )

читать инструкцию http://www.postgresql.org/docs/current/static/functions-matching.html

31 голосов
/ 14 марта 2014
select regexp_replace(field, E'[\\n\\r\\u2028]+', ' ', 'g' )

У меня была та же проблема в моем postgres d / b, но рассматриваемая новая строка не была традиционным ascii CRLF, это был разделитель строки в юникоде, символ U2028. Приведенный выше фрагмент кода также фиксирует этот вариант Unicode.

Обновление ... хотя я когда-либо встречал вышеупомянутые символы "в дикой природе", чтобы следовать совету lmichelbacher, чтобы перевести еще больше символов юникода, похожих на новую строку , используйте это: 1007 *

select regexp_replace(field, E'[\\n\\r\\f\\u000B\\u0085\\u2028\\u2029]+', ' ', 'g' )
18 голосов
/ 13 февраля 2016

ОП спрашивал конкретно о регулярных выражениях, так как может показаться, что существует проблема с рядом других символов, а также с символами новой строки, но для тех, кто просто хочет удалить символы новой строки, вам даже не нужно переходить к регулярное выражение. Вы можете просто сделать:

select replace(field,E'\n','');

Я думаю, что это стандартное поведение SQL, поэтому оно должно распространяться на все, кроме, возможно, самых ранних версий Postgres. Выше испытано нормально для меня в 9,4 и 9,2

7 голосов
/ 26 февраля 2016

Если вам нужно удалить разрывы строк в начале или конце строки, вы можете использовать это:

UPDATE table 
SET field = regexp_replace(field, E'(^[\\n\\r]+)|([\\n\\r]+$)', '', 'g' );

Помните, что шляпа ^ означает начало строки, а знак доллара $ означает конец строки.

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...