Или "почему я раньше об этом не знал?"
У всех у нас есть грешок иногда хранить в базе массив данных в виде json и проект на подработке не стал исключением
Сегодня потребовалось найти такие строки в таблице, среди которых есть совпадение с элементами массива
Например, есть строка адреса с названием "Ленина" и массивом домов [1, 12, 123]
На входе принимаем "12" в качестве поиска и должны выдать "Ленина, 12" и "Ленина, 123"
Можно конечно сделать like на строковом представлении json'а, но мы тогда получим всю строку и придется в коде вручную выбирать подходящие значения
Но я обнаружил очень интересную конструкцию в потсгре — lateral, и запрос стал выглядеть так:select street_name,По факту мы получаем какое-то виртуальное представление, где каждая строка с адресом разрослась столькими копиями, сколько есть вхождений в массивах и каждое это значение можно вытянуть, обратившись к
house_number::int
from address,
lateral jsonb_array_elements_text(house_numbers) as house_number
where street_name = 'Ленина'
and house_number like '12'house_numberНа выходе естественно имеем две записи, как и требовалось!
Теперь плохие архитектурные решения можно оправдывать тем, что даже из такой ситуации есть удобный выход😄
Добавить комментарий