怎么办'any(:: text [])ilike :: text'

Bon*_*ton 2 postgresql string-comparison any conditional-statements

这是表结构

table1
pk int, email character varying(100)[]

data
1, {'mr_a@gmail.com', 'mr_b@yahoo.com', 'mr_c@postgre.com'}
Run Code Online (Sandbox Code Playgroud)

我试图实现的是从记录中找到任何'gmail'

query
select * from table1 where any(email) ilike '%gmail%';
Run Code Online (Sandbox Code Playgroud)

但是任何()只能在左侧,而者()可能会降低性能.有谁有任何想法?

编辑

实际上,当我第一次发帖时,我有点混淆.我尝试通过任何(array [])实现.

这是我的实际结构

pk int, 
code1 character varying(100), 
code2 character varying(100), 
code3 character varying(100), ...
Run Code Online (Sandbox Code Playgroud)

我的第一个approch是

select * from tabl1 where code1 ilike '%code%' or code2 ilike '%code%' or...
Run Code Online (Sandbox Code Playgroud)

然后我试试

select * from table1 where any(array[code1, code2, ...]) ilike '%code%'
Run Code Online (Sandbox Code Playgroud)

这是行不通的.

Pet*_*aut 5

创建一个实现ILIKE"向后" 的运算符,例如:

CREATE FUNCTION backward_texticlike(text, text) RETURNS booleans
    STRICT IMMUTABLE LANGUAGE SQL
    AS $$ SELECT texticlike($2, $1) $$;

CREATE OPERATOR !!!~~* (
    PROCEDURE = backward_texticlike,
    LEFTARG = text,
    RIGHTARG = text,
    COMMUTATOR = ~~*
);
Run Code Online (Sandbox Code Playgroud)

(注意,ILIKE内部对应于操作员~~*.为反向选择您自己的名称.)

然后你就可以跑了

SELECT * FROM table1 WHERE '%code%' !!!~~* ANY(ARRAY[code1, code2, ...]);
Run Code Online (Sandbox Code Playgroud)