Как найти с помощью частичной строки из списка строк, разделенных запятыми, затем нужно удалить всю строку из списка значений

#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 /…