Если вы используете MySQL 8.0, вы можете использовать рекурсивный запрос для сравнения строк символ за символом:
with recursive chars as (
select rownum, template, answers, 1 idx, 0 res from mytable
union all
select
rownum,
template,
answers,
idx + 1,
res + ( substr(template, idx, 1) = substr(answers, idx, 1) )
from chars
where idx <= least(char_length(template), char_length(answers))
)
select rownum, max(res) result from chars group by rownum order by rownum
В CTE (предложение with
) якорь (запрос до union all
) выбирает всю таблицу, затем рекурсивный элемент (запрос после union all
) сравнивает символы, и текущая позиция (idx
) увеличивает результат (res
), если они совпадают, и переходит к Следующая позиция, пока (самая маленькая) строка не будет исчерпана. Тогда внешний запрос просто агрегирует по rownum
.
Демонстрация на DB Fiddle :
rownum | result
-----: | -----:
1 | 12
2 | 10
Пожалуйста, имейте в виду, что это запрос не будет хорошо работать с большим набором данных. Существуют и другие более эффективные решения (обычно с использованием таблицы чисел вместо рекурсивного cte), но в основном, как прокомментировал Гордон Линофф, вы действительно хотите исправить свою структуру данных , если вам нужно выполнить такие запросы , Вы должны хранить каждый символ в отдельной строке вместе с rownum
и его индексом в строке. Материализуйте правильную структуру данных, и тогда вам не нужно будет генерировать ее на лету в каждом запросе.