Запрос 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 шт):
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

