Подтвердить что ты не робот

Разделенная разделенная запятыми строка SQL

У меня есть столбец с переменным числом разделенных запятыми значений:

somethingA,somethingB,somethingC
somethingElseA, somethingElseB

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

somethingA
somethingB
somethingC
somethingElseA
somethingElseB

Как это сделать в SQL (MySQL)?

(Я пробовал поиск в googling "implode" и "боковое представление", но, похоже, не возникают связанные вопросы. Все связанные с этим вопросы SO пытаются сделать гораздо более сложные вещи)

4b9b3361

Ответ 1

Вы можете сделать это с помощью чистого SQL, подобного этому

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
  FROM table1 t CROSS JOIN 
(
   SELECT a.N + b.N * 10 + 1 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
    ORDER BY n
) n
 WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
 ORDER BY value

Примечание. Фокус в том, чтобы использовать таблицу подсчета (чисел) и очень удобную в этом случае функцию MySQL SUBSTRING_INDEX(). Если вы выполняете много таких запросов (расщепление), вы можете подумать о том, чтобы заполнить и использовать сохраненную таблицу таблиц вместо генерации на лету с подзапросом, как в этом примере. Подзапрос в этом примере генерирует последовательность чисел от 1 до 100, эффективно позволяя вам разделить до 100 значений с разделителями на строку в исходной таблице. Если вам нужно больше или меньше, вы можете легко его отрегулировать.

Вывод:

|          VALUE |
|----------------|
|     somethingA |
|     somethingB |
|     somethingC |
| somethingElseA |
| somethingElseB |

Вот SQLFiddle демо


Вот как выглядит запрос с сохраненной таблицей таблиц

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
  FROM table1 t CROSS JOIN tally n
 WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
 ORDER BY value

Вот SQLFiddle демо