这是表格结构

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

data
1, {'[email protected]', '[email protected]', '[email protected]'}

我要做的是从记录中找到任何一个“gmail”
query
select * from table1 where any(email) ilike '%gmail%';

但是any()只能在左边,unest()可能会降低性能。有人知道吗?
编辑
实际上我第一次发帖的时候有点困惑。我试图通过任何(数组[])来实现。
这是我的实际结构
pk int,
code1 character varying(100),
code2 character varying(100),
code3 character varying(100), ...

我的第一个办法是
select * from tabl1 where code1 ilike '%code%' or code2 ilike '%code%' or...

然后我试着
select * from table1 where any(array[code1, code2, ...]) ilike '%code%'

这不管用。

最佳答案

创建实现“向后”的运算符,例如:

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 = ~~*
);

(注意ILIKE内部对应于运算符ILIKE。选择你自己的名字。)
然后你就可以跑了
SELECT * FROM table1 WHERE '%code%' !!!~~* ANY(ARRAY[code1, code2, ...]);

关于postgresql - 怎么做'any(:: text [])ilike::text',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5376850/

10-12 12:51