2015-02-06 3 views
1

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

Следующий запрос обрезает пробельные:

SELECT TRIM(column) 
FROM table; 

Хотя это один урезает: новые строки

SELECT TRIM('\n' FROM column) 
FROM table; 

Я также пытался this answer, но он не работает:

SELECT TRIM(BOTH '\t' OR '\n' FROM TRIM(BOTH '\n' OR '\t' FROM TRIM(column))) 
FROM table; 

Есть ли способ удалить сочетание обоих типов ведущих и конечных символов?

UPDATE: Я не могу ЗАМЕНИТЬ, потому что мне все еще нужны символы пробелов/символов новой строки, когда они встречаются внутри содержимого.

У меня есть поля с пробелом, за которым следует куча новых строк, за которыми последует больше пробелов/строк. Отсюда и дилемма.

+0

Не знаете, почему вы потрудились попробовать этот ответ, когда комментарии показывают, что он сломан. –

+0

Так что, чтобы быть абсолютно ясным, ваше поле выглядит следующим образом: (1) предисловие пучка белого пространства и новых линий, за которым следует (2) фактическое содержание, которое может иметь внутри него больше свободного пространства и новых строк, а затем (3) завершение пробела и новых строк? И вы хотите удалить (1) и (3)> – lurker

+0

Это точно. –

ответ

0

Законченное делать это в Ruby:

def process_text(text) 
    if text 
    text.force_encoding('UTF-8') 
    .gsub(/((\.\s)|\.|\u2026){4,}/, '...') # shorten multiple dots (or ellipsis) to 3 dots 
    .gsub(/((\-\s)|\-){4,}/, '---') # shorten multiple dashes to 3 dashes 
    .gsub(/((\_\s)|\_){4,}/, '___') # shorten multiple underscores to 3 underscores 
    .gsub(/\p{Sm}|\u2022|\u2023/, ' ') # remove bullets 
    .gsub(/[^[[:alnum:]] | \p{Sc} | \p{Cc} | [[:punct:]]]/, ' ') # preserve accented letters and currency signs 
    .gsub(/^(\v|\f|\n|\t|\s|\u2029){3,}/, "\n") 
    .strip 
    end 
end 
1

Альтернативный способ заменить «\ n» пустой строкой, а затем обрезать ее. Вот код:

SELECT TRIM(REPLACE(column, '\n','')) from table; 

Или вы можете позвонить в отделку дважды, если хотите.

SELECT TRIM(TRIM('\n' FROM column)) from table; 
+0

Я не могу «ЗАМЕНИТЬ», потому что я все еще хочу, чтобы символы пробелов/символов новой строки присутствовали, когда они возникали в обращении. 'SELECT TRIM (TRIM ('\ n' FROM column)) из таблицы;' не будет работать, потому что у меня есть поля с пробелом, за которым следует куча строк новой строки, за которыми последует больше пробелов. Отсюда и дилемма. –

2

Почему нет:

SELECT TRIM(TRIM('\n' FROM `column`)) 
FROM `table`; 

Я не пробовал, но, логически мыслить и hellip;

0

К сожалению TRIM(BOTH '\n' OR '\r' FROM myfield) не работает. Поэтому следующий код урезает только один символ перевода строки (\r\n) заявление, а не кратно:

SELECT TRIM(TRIM(BOTH '\n' FROM(TRIM(BOTH '\r' FROM myfield)))) FROM mytable 

Обратите внимание, что выше утверждение не подрезать <space>\r\n mytext к mytext, потому что \r\n не в начале.

Раствор для MariaDB

Если вы используете MariaDB (https://mariadb.com/kb/en/mariadb/pcre/), вы можете использовать регулярные выражения, чтобы решить вашу проблему. Следующее выражение удаляет весь префикс пробела из текста:

SELECT REGEXP_REPLACE(myfield, '^[\r\n ]*(.*)', '\\1') FROM mytable 
Смежные вопросы