MySQL разделение значений столбцов

#mysql #sql #string #csv

#mysql #sql #строка #csv

Вопрос:

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

 1223,7990,8373,3892,7654,8908
  

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

И затем проверьте, находится ли это разделение vale из столбца внутри инструкции array — значение столбца В (7990).

Комментарии:

1. Вы могли бы попробовать FIND_IN_SET . Это предназначено для строк, поэтому я не уверен на 100%, насколько хорошо это будет работать для чисел; у меня нет большого опыта, поскольку поля, содержащие значения, разделенные несколькими / запятыми, обычно являются плохой идеей.

Ответ №1:

Существует ли какая-либо функция 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. Спасибо, это именно то, что я ищу.

2. @bukaj.multis будь хорошим спортсменом, а также поддержи GMB, поскольку этот ответ является обновлением, основанным на его ответе.

3. @RaymondNijland: Мне тоже нравится ваш ответ (и ваше спортивное мастерство)!

Ответ №2:

Чтобы разделить строку 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:

 | 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);
  

Комментарии:

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