удаление не алфавитно-цифрового символа из конца и начало всех столбцов - PullRequest
3 голосов
/ 16 декабря 2011

У меня есть несколько таблиц, имеющих более 20 столбцов, и мне нужно

  1. Обрезать сначала
  2. Удалить все не алфавитно-цифровые символы и не символ ')' в конце каждого столбца
  3. Удалить все не алфавитно-цифровые символы и не символы '(' с 1-ой позиции каждого столбца

Если это из всей строки, я могу просто использовать метод замены, но в моемтолько в первой позиции и в последней позиции. Так что теперь я использую подстроку, проверяю специальные символы и заменяю пустым пространством. Я чувствовал, что это какая-то ручная очистка, я уверен, что это не элегантная.

Какой-нибудь быстрый подход (запрос), который помогает мне очистить данные?

1 Ответ

1 голос
/ 16 декабря 2011

Должна ли база данных быть в сети для этого? Столкнувшись с этой проблемой, я подумал бы о том, чтобы выгружать данные в файлы для обработки с помощью perl, awk или другого инструмента, подходящего для обработки текста таким способом.

Если это невозможно, другой альтернативой является построение алгоритма обработки внутри FUNCTION , который получает VARCHAR и возвращает очищенную строку в виде VARCHAR (NB-непроверенный код, только пояснительный):

CREATE FUNCTION cleanup(instr VARCHAR(255)) RETURNS VARCHAR(255));
    DECLARE outstr VARCHAR(255);
    SET outstr = TRIM(instr);
    IF NOT (outstr REGEXP '^[[:alnum:][.left-parenthesis.]]');
        SET outstr = SUBSTRING(outstr,2);
    END IF;
    WHILE NOT (outstr REGEXP '[[:alnum:][.right-parenthesis.]]$' DO
        SET outstr = LEFT(outstr, LENGTH(outstr)-1);
    END WHILE;
    SELECT outstr;
END FUNCTION;

Затем вы можете написать запрос, который читает системные каталоги, т.е. information_schema.columns и генерирует требуемые операторы UPDATE. Что-то вроде (не проверено):

SELECT CONCAT_WS(" ", "UPDATE", table_name, 
                 "SET", column_name, " = cleanup(", column_name, ")")
  FROM information_schema.columns
  WHERE table_schema = "your-database" AND collation_name IS NOT NULL

Сохраните вывод этого, проверьте его и запустите.

Фильтр collation_name должен гарантировать, что мы ограничиваем это только текстовыми полями. Опять же, это не проверено, но должно дать вам общее представление. Вы могли бы даже использовать GROUP_CONCAT для создания версии, которая создает один SQL-оператор для таблицы, а не для столбца, но это немного причудливо.

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

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