Используйте ilike any () с escape-символом - PullRequest
2 голосов
/ 18 октября 2019

В PostgreSQL вы можете выполнять нечувствительный к регистру запрос с помощью ILIKE:

select * from test where value ilike 'half is 50$%' escape '$'

И вы можете запрашивать несколько значений одновременно, комбинируя ILIKE с ANY()

select * from test where value ilike any(array['half is 50%', 'fifth is 20%'])

Запрос выше будет соответствовать 'Fifth is 2019', что мне не нужно, но когда я пытаюсь использовать ILIKE и ANY() с escape-символом, я получаю синтаксическую ошибку.

Я что-то упустилглупо, или это просто не поддерживается? Если нет, есть ли другой способ запроса в регистронезависимом режиме с несколькими значениями одновременно?

РЕДАКТИРОВАТЬ: Чтобы уточнить, запрос будет принимать параметры через JDBC, поэтому фактический SQL будетвыглядеть примерно так:

select * from test where value ilike any(?) escape '$'

Вот почему я смотрю, что make% и _ из пользовательского ввода интерпретируются как литералы.

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Предложение ESCAPE в ILIKE относится только к литералам и не применяется к выражениям. Вы должны использовать обратную косую черту, или, если это невозможно, вы можете попробовать:

with test(value) as (
values 
    ('half is 50%'),
    ('half is 50x'),
    ('fifth is 20%'),
    ('fifth is 2000')
)

select * 
from test
where value ilike any(select replace(unnest(array['half is 50$%', 'fifth is 20$%']), '$', '\'))

    value     
--------------
 half is 50%
 fifth is 20%
(2 rows)

Выглядит немного неуклюже, но хорошо работает.

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

Чтобы сопоставить их как необработанные строки, вы можете использовать оператор ~* для нечувствительного совпадения.

knayak=# select 'Half is 50%' ~* any(array['half is 50%', 'fifth is 20%'])
knayak-# ;
 ?column?
----------
 t            --True
(1 row)

knayak=# select 'fifth is 20' ~* any(array['half is 50%', 'fifth is 20%']);
 ?column?
----------
 f             --False
(1 row)

Если вы хотите экранировать правые операнды ilike, используйте строковые константы escape, которые являются расширением стандарта SQL. Константа escape-строки указывается путем написания буквы E (в верхнем или нижнем регистре) непосредственно перед открывающей одинарной кавычкой

knayak=# select 'Half is 50%' ilike any(array[E'half is 50\\%', E'half is 20\\%'])
knayak-# ;
 ?column?
----------
 t
(1 row)

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...