Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL разделен ред, разделен със запетая

Можете да го направите с чист 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 ограничени стойности на ред в таблицата на източника. Ако имате нужда от повече или по-малко, можете лесно да го коригирате.

Изход:

<пред>| СТОЙНОСТ ||----------------|| нещоА || нещо B || нещоC || нещо другоA || нещо другоB |

Ето SQLPiddle демонстрация

Ето как може да изглежда заявката с постоянна таблица за изчисление

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
 

Ето SQLPiddle демонстрация




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да променя референтното действие на външния ключ? (поведение)

  2. Най-добри практики за репликация на MySQL

  3. MySQL избира една колона DISTINCT, със съответните други колони

  4. Времето за изчакване на заключване е превишено; опитайте да рестартирате транзакцията, въпреки че не използвам транзакция

  5. MIN() срещу LEAST() в MySQL:Каква е разликата?