Запрос sql на выборку с подменой значений (Case и Like)

Всем привет! Помогите решить задачу. Предположим имеется таблица с полями (id/code/name). В поле код содержатся значения соответствующие определенной категории (могут содержаться в тексте, поэтому приходится использовать Like). К примеру ibm25 - самолеты. ibm25-1 - вертолеты. Нужно написать запрос на выборку, в результате которого, эти коды будут представлены в читабельном виде. Я написал запрос:

select distinct a.category, case WHEN a.category like '%25-1%' THEN 'Немодерируемый UGC'
WHEN a.category like '%IAB25%' THEN 'Нестандартный контент'
else 'Категория отсутствует в справочнике'

end AS "1"
from register.creative a

Сложность в том, многие коды могут начинаться одинаково. Пробовал искать по конечной части значений, но Like WHEN a.category like '%25-1%' THEN 'вертолеты' здесь мне все равно возвращает значение "самолеты".

Пример таблицы: Таблица с данными

ID Type Category
1 Картинка IAB25
2 Видео IAB25 Non-Standard Contenеt
2 Видео IAB25-1
2 Видео IAB26-1 Illegal Content
2 Видео IAB25-3

Таблица соответствия кодов: введите сюда описание изображения

Code Name
IAB25 Нестандартный контент
IAB25-1 Немодерируемый UGC
IAB26 Незаконный контент
IAB26-1 Незаконный контент
IAB25-3 Нецензурный контент

На выходе хочу получить вместо IAB.. значение которое ему соответствует. Помогите разобраться. Может у кого есть еще какие либо варианты решения задачи?


Ответы (1 шт):

Автор решения: Akina
WITH cte AS (
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY content.Category ORDER BY LENGTH(categories.code) DESC) rn
    FROM content
    JOIN categories ON LOCATE(categories.code, content.category)
)
SELECT id, type, category, code, name
FROM cte
WHERE rn = 1;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e0f5bc4d1c74778cd87427bf7cea9150

→ Ссылка