MySql значения разделительного столбца - PullRequest
0 голосов
/ 29 марта 2019

У меня есть столбец с разделенными данными.

1223,7990,8373,3892,7654,8908

Существует ли какая-либо функция MYSQL, которая будет разбивать столбец на 0..N строк, разделенных запятой?

И затем проверьте, находится ли этот разделенный столбец из столбца внутри оператора массива - значение столбца IN (7990).

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Существует ли какая-либо функция MYSQL, которая будет разбивать столбец на строки 0..N, разделенные запятой?

Было бы обновление ответа GMB, который использует генератор чисел для автоматическогоразделить строки, используя вложенные функции SUBSTRING_INDEX().

SELECT 
  DISTINCT
     t.val 
   , SUBSTRING_INDEX(SUBSTRING_INDEX(t.val, ',', number_generator.row_number),   ',', -1) parsed_val
FROM (
  SELECT 
   @row := @row + 1 AS row_number
  FROM (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row1
  CROSS JOIN (
    SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
  ) row2  
  CROSS JOIN (
    SELECT @row := 0 
  ) AS init_user_params
) AS number_generator
CROSS JOIN 
 t

Результат

| val                           | parsed_val |
| ----------------------------- | ---------- |
| 1223,7990,8373,3892,7654,8908 | 1223       |
| 1223,7990,8373,3892,7654,8908 | 7990       |
| 1223,7990,8373,3892,7654,8908 | 8373       |
| 1223,7990,8373,3892,7654,8908 | 3892       |
| 1223,7990,8373,3892,7654,8908 | 7654       |
| 1223,7990,8373,3892,7654,8908 | 8908       |

см. демо

1 голос
/ 29 марта 2019

Чтобы разбить строку CSV на части, вот решение, которое использует SUBSTRING_INDEX():

SELECT
    val,
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',1), ',', -1) val1, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',2), ',', -1) val2, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(val,',',2), ',', -1) val3
FROM t;

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

Демонстрация на DB Fiddle :

| val                           | val1 | val2 | val3 |
| ----------------------------- | ---- | ---- | ---- |
| 1223,7990,8373,3892,7654,8908 | 1223 | 7990 | 7990 |

С другой стороны, если вы просто хотите проверить, является ли данное значение частью строки CSV, вы можете просто использовать FIND_IN_SET(), например:

SELECT val FROM t WHERE FIND_IN_SET('1223', val);
...