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)
这是行不通的.
创建一个实现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)
| 归档时间: |
|
| 查看次数: |
1636 次 |
| 最近记录: |