2014-09-26 4 views
1

Предположим, что у меня есть строка случайных символов со строк в кавычках внутри так:Извлечение подстроки в MySQL

а: 15: Я: 0s: 3: "Foo" I: 1s: 3: "BAR" I: 2s: 3: "БАЗ" I: 3s: 3: "ALPHA100" I: 4s: 3: "ALPHA500" I: 5s: 3: "BRAVO250" I: 6s: 3

Я бы подобно совпадению строк с кавычками, внутри которых всегда содержатся три заглавные буквы или пять заглавных букв, за которыми следуют три цифры. В JavaScript я могу это сделать:

" the string ".match(/"([A-Z]{3}|[A-Z]{5}\d{3})"/g); 

Я посмотрел в REGEXP оператора для MySQL но это, кажется, применимы только для условных предложений.

В идеале я хотел бы, чтобы выбрать все строки, обрезать кавычки, и сделать GROUP_CONCAT, чтобы получить обратно окончательный результирующий набор одной строки так:

"FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250" 

В идеале я хотел бы сделать это на уровне базы данных, чтобы не загружать все строки и запускать их через мою однострочную программу JavaScript.

ответ

0

я покажу функцию, которая основана на струнной расщепления, как показано на SQL split values to multiple rows, которые будут использоваться как

SELECT get_the_parts(theString) FROM example; 

Эта функция работает следующим образом: - разбить строку в таблицу с частями, используя двойной цитата, как разделитель - выбрать только те части, которые соответствуют точно 3 заглавным буквам или 5 заглавных букв следуют три цифры - сцепляет выбранные части с запятой в качестве разделителя

DELIMITER // 
CREATE FUNCTION get_the_parts(myString VARCHAR(2000)) RETURNS VARCHAR(2000) 
BEGIN 
    DECLARE result VARCHAR(2000); 

    SELECT 
    GROUP_CONCAT(t.value) INTO result 
    FROM (
     SELECT 
     SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1) value 
     FROM (SELECT myString AS col) e 
     CROSS JOIN (
     -- creates a numbers table with the values from 1 to 1,000 on the fly 
     SELECT 
      1 + a.N + b.N * 10 + c.N * 100 AS n 
     FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c 
     ORDER BY n  
    ) n 
     WHERE 
     n.n <= 1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', '')) 
    ) t 
    WHERE 
     t.value REGEXP '^([A-Z]{3}|[A-Z]{5}[0-9]{3})$'; 

    return result; 
END // 
DELIMITER ; 

Объяснение

Создание таблицы чисел

Внутренний подзапрос с UNION ALL создает на лета таблицы чисел с числами от 1 до 1000. Этого подзапроса может легко замещен с помощью таблицы чисел в базе данных ,

Расщепление строка

С вложенным зовут SUBSTRING_INDEX разрежет п-я подстроки между сепараторами. Мы используем двойные кавычки как разделитель:

SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1) 

Выражение

1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', '')) 

дает нам количество деталей, потому что это один появление более вхождений сепаратора.

Выбор разыскиваемые части

Мы используем регулярное выражение

'^([A-Z]{3}|[A-Z]{5}[0-9]{3})$' 

потому, что наши части получили не точно соответствовать известному регулярному_выражению от начала ^ до конца $ без больше содержания.

Конкатенация

Наконец мы используем GROUP_CONCATE с разделителем по умолчанию, запятой, чтобы получить желаемый результат.

Замечания

Я построил Demo.
Вы можете легко изменить эту функцию в соответствии с вашими потребностями.
Вы действительно предпочитаете это? Я бы рекомендовал использовать ваш однострочный javascript. Текстовая обработка этой формы на самом деле не соответствует реляционным базам данных.

+0

Это, безусловно, функция, но я думаю, что буду придерживаться моей строки кода JavaScript :-P –

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