Если вы хотите построить логику, связанную со строками, union
концепции могут хорошо подойти,
кстати, в строковых операциях мы бы лучше использовали параметры сортировки с шаблонами через upper
или lower
функции, чтобы удовлетворить нечувствительность к регистру для букв:
select id from customers where lower(name) like '%roger%' union all
select id from customers where lower(name) like '%federer%';
и нет необходимости добавлять уже включено полное имя (например, Роджер Федерер ).
Редактировать:
Альтернативный метод может быть следующим:
select distinct id
from (select lower(regexp_substr('&str', '[^[:space:]-]+', 1, 1)) frst,
lower(regexp_substr('&str', '[^[:space:]-]+', 1, 2)) lst,
lower('&str') nm
from customers) c1
cross join customers c2
where c1.frst like '%' || lower(c2.name) || '%'
or c1.lst like '%' || lower(c2.name) || '%'
or c1.nm like '%' || lower(c2.name) || '%';
добавив строку поиска ('&str'
), чтобы сделать запрос более динамичным, как вы хотите.
(при появлении запроса введите Roger Federer для str
переменной подстановки)