Как извлечь строки, встречающиеся после определенного символа в MySQL? - PullRequest
1 голос
/ 15 марта 2019

Если у меня есть строка:

'#name#user#user2#laugh#cry'

Я хотел бы напечатать,

name
user
user2
laugh
cry

Все строки разные и имеют разное количество '#'.

Я пытался использовать Regex, но он не работает. Какую логику нужно применить для этого запроса?

1 Ответ

3 голосов
/ 15 марта 2019

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

Быстрое и грязное решение состоит в том, чтобы использовать таблицу чисел или встроенный запрос и перекрестно соединить ее с таблицей;REGEXP_SUBSTR() (доступно в MySQL 8.0), позволяет выбрать конкретный экземпляр определенного шаблона.

Вот запрос, который извлечет до 10 значений из столбца:

SELECT
    REGEXP_SUBSTR(t.val, '[^#]+', 1, numbers.n) name
FROM
    mytable t
    INNER JOIN (
        SELECT 1 n 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 UNION ALL SELECT 10
) numbers
    ON REGEXP_SUBSTR(t.val, '[^#]+', 1, numbers.n) IS NOT NULL

Regexp [^#]+ означает: столько последовательных символов, сколько возможно, кроме #.


Ths демонстрация на DB Fiddle , когда задана входная строка'#name#user#user2#laugh#cry', возвращает:

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