Как выполнить «поиск» по строке значений для записей, столбцы которых содержат указанные значения - PullRequest
1 голос
/ 11 октября 2019

Хорошо, я попытаюсь объяснить это так просто, как только смогу.

Скажем, у меня есть 3 записи определенной таблицы. Мы назовем эту таблицу Objs, и у Objs есть атрибут типа string, называемый colors (обратите внимание, что это множественное число). Вот 3 гипотетических записи в базе данных и соответствующие им значения цветов:

obj1 colors: "red, green, blue"

obj2 colors: "blue, orange, yellow, green"

obj3 colors: "teal, purple"

Хорошо, теперь скажем, я хочу иметь возможность найти подмножество записей, которые имеют что-то общее (хорошая ситуация дляиспользовать метод WHERE, верно?) Однако я должен иметь возможность поддерживать поиск этих записей, используя либо одиночные, либо даже множественные значения. Например:

Скажите, что мой запрос: "red, green".

Тогда результирующая коллекция записей должна быть obj1 и obj2, так как их значения цвета включают ключевые слова «красный»"и" зеленый ".

Скажите, что мой запрос: "blue, purple".

Полученная коллекция должна содержать obj1, obj2 и obj3.

Кроме того, формат запроса и атрибуты Obj будут значениями, разделенными символом «,», поскольку атрибуты и сам запрос генерируются массивом. Т.е. атрибуты объекта и сами запросы всегда будут иметь такой формат:

"value1, value2, value3, value4"

. Никогда не будет так:

"value1 value2 value3 value4"

или любой другой возможный формат.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Вы можете сравнить значение, рассматривая его как массив, с другим массивом. Например:

SELECT *
FROM example
WHERE string_to_array(colors,', ') && array['red','blue'];

Оператор && здесь проверяет наличие совпадений.

Раскрытие информации: Я сотрудник EnterpriseDB (EDB).

0 голосов
/ 11 октября 2019

Давайте обернем это в функцию, сначала мы создаем массив из строки поиска, чтобы узнать, сколько нам нужно запросов, затем мы готовим запрос, и в качестве последнего шага мы передаем наш запрос и поисковые слова нашей модели.

def search_function(search_string)
  names_array = search_string.split(', ')
  query = 'name LIKE ?'
  number_of_ors = names_array.count
  number_of_ors.times do 
    query += ' OR name LIKE ?'
  end
  Objects.where(query, *names_array)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...