#mysql
#mysql
Вопрос:
У нас есть требование в запросе Mysql, чтобы найти с частичной строкой из списка строк, разделенных запятыми. Затем необходимо удалить найденную строку из списка, разделенного запятыми.
Согласно приведенному ниже примеру, нам нужно найти строку, начинающуюся с «Ожидание», затем нужно удалить найденную строку из списка, разделенного запятыми, с помощью запроса Mysql.
|-------------------|-----------------------------------------|
| Id | Tag |
|-------------------|-----------------------------------------|
| 1 | Completed, #4CHD, Pending with ABC |
|-------------------|-----------------------------------------|
| 2 | Open, Pending with Mrg, #4CHD |
|-------------------|-----------------------------------------|
| 3 | Pending with cons, Resolved |
|-------------------|-----------------------------------------|
Вывод должен быть:
|-------------------|-----------------------|
| Id | Tag |
|-------------------|-----------------------|
| 1 | Completed, #4CHD |
|-------------------|-----------------------|
| 2 | Open, #4CHD |
|-------------------|-----------------------|
| 3 | Resolved |
|-------------------|-----------------------|
Ответ №1:
Для MySQL 8
SELECT test.id, GROUP_CONCAT(TRIM(jsontable.value)) Tag
FROM test
CROSS JOIN JSON_TABLE(CONCAT('["', REPLACE(test.Tag, ',', '","'), '"]'),
'$[*]' COLUMNS( value VARCHAR(255) PATH '$')
) jsontable
WHERE TRIM(jsontable.value) NOT LIKE CONCAT(@criteria, '%')
GROUP BY test.id
Для MySQL 5.x
SELECT test.id,
GROUP_CONCAT(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(test.Tag, ',', nums.num), ',', -1))) Tag
FROM test
JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) nums
ON nums.num <= 1 LENGTH(test.Tag) - LENGTH(REPLACE(test.Tag, ',', ''))
WHERE TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(test.Tag, ',', nums.num), ',', -1)) NOT LIKE CONCAT(@criteria, '%')
GROUP BY test.id
Никакие строки не должны игнорироваться в выходных данных. Предположим, что 3-я строка имеет значение тега только как «Ожидание с минусами». В этом случае первые два отображаются на выходе, а 3-я строка игнорируется. Мое требование — 3-е, также должно отображаться с пустым тегом.
Если это так, необходимо ЛЕВОЕ СОЕДИНЕНИЕ (и перемещение выражения условия с МЕСТА на место):
SELECT test.id,
GROUP_CONCAT(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(test.Tag, ',', nums.num), ',', -1))) Tag
FROM test
LEFT JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) nums
ON nums.num <= 1 LENGTH(test.Tag) - LENGTH(REPLACE(test.Tag, ',', ''))
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(test.Tag, ',', nums.num), ',', -1)) NOT LIKE CONCAT(@criteria, '%')
GROUP BY test.id
Комментарии:
1. @Mihai Для версии 5.x необходимо проанализировать CSV, используя таблицу статических / синтетических чисел и double
SUBSTRING_INDEX()
.2. @Akina Здесь установленная версия MySQL ниже 8.0. Я столкнулся со следующей ошибкой: ОШИБКА 1064 (42000): у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘(CONCAT(‘[«‘, REPLACE(tik.Tag, ‘,’, ‘»,»‘), ‘»]’), ‘$[*]’ ‘ в строке 8
3. @Ramsethu Установленная версия MySQL ниже 8.0 , добавьте в вопрос точную версию сервера. Также укажите максимальное количество отдельных значений для каждого
Tag
значения.4. @Ramsethu обновлено. Отрегулируйте
nums
по мере необходимости.5. @Akina Это работает нормально. Большое вам спасибо за вашу помощь. Одна небольшая проблема, с которой я сталкиваюсь. Никакие строки не должны игнорироваться в выходных данных. Предположим, что 3-я строка имеет значение тега только как «Ожидание с минусами». В этом случае первые два отображаются на выходе, а 3-я строка игнорируется. Мое требование — 3-е, также должно отображаться с пустым тегом. Пожалуйста, посмотрите на URL: dbfiddle.uk /…