Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 将ilike any()与转义字符一起使用_Postgresql_Jdbc - Fatal编程技术网

Postgresql 将ilike any()与转义字符一起使用

Postgresql 将ilike any()与转义字符一起使用,postgresql,jdbc,Postgresql,Jdbc,在PostgreSQL中,您可以使用ILIKE执行不区分大小写的查询: select * from test where value ilike 'half is 50$%' escape '$' 通过将ILIKE与ANY()组合,您可以一次查询多个值 上面的查询将匹配'Fifth is 2019',这是我不想要的,但是当我尝试将ILIKE和ANY()与转义字符一起使用时,我得到一个语法错误 我是错过了一些愚蠢的事情,还是根本不支持?如果没有,是否有其他方法可以同时使用多个值以不区分大小写的方

在PostgreSQL中,您可以使用
ILIKE
执行不区分大小写的查询:

select * from test where value ilike 'half is 50$%' escape '$'
通过将
ILIKE
ANY()组合,您可以一次查询多个值

上面的查询将匹配
'Fifth is 2019'
,这是我不想要的,但是当我尝试将
ILIKE
ANY()
与转义字符一起使用时,我得到一个语法错误

我是错过了一些愚蠢的事情,还是根本不支持?如果没有,是否有其他方法可以同时使用多个值以不区分大小写的方式进行查询

EDIT:为了澄清,查询将通过JDBC接受参数,因此实际的SQL看起来像

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

这就是为什么我希望将用户输入中的make%和uu解释为文字

要将它们作为原始字符串进行匹配,可以使用
~*
运算符进行不敏感匹配

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的右侧操作数,请使用“转义”字符串常量,这是SQL标准的扩展。转义字符串常量是通过在开头单引号前写字母E(大写或小写)来指定的

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

ILIKE
中的
ESCAPE
子句仅指文字,不适用于表达式。您应该使用反斜杠,如果不可能,您可以尝试:

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)

看起来有点笨拙,但效果很好。

在您使用
any()
的第二个示例中,您是否仍希望摆脱
%
?@richyn是的。我对问题做了一些编辑以澄清问题。我对问题进行了编辑以澄清我的情况。使用
~*
将与使用正则表达式匹配,因此我必须转义圆点等。你的第二个例子很有趣,但我不确定如何在参数前面添加E。啊,我没有意识到如果你在查询中没有指定转义字符,默认情况下会使用反斜杠。谢谢
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)