я покажу функцию, которая основана на струнной расщепления, как показано на 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. Текстовая обработка этой формы на самом деле не соответствует реляционным базам данных.
Это, безусловно, функция, но я думаю, что буду придерживаться моей строки кода JavaScript :-P –