#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.
| 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 я опубликовал ответ, который может сделать это автоматически