Question

here is table structure

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

data
1, {'mr_a@gmail.com', 'mr_b@yahoo.com', 'mr_c@postgre.com'}

what i try to achieve is find any 'gmail' from record

query
select * from table1 where any(email) ilike '%gmail%';

but any() can only be in left-side and unnest() might slow down performance. anyone have any idea?

edit

actually i kinda confuse a bit when i first post. i try to achieve through any(array[]).

this is my actual structure

pk int, 
code1 character varying(100), 
code2 character varying(100), 
code3 character varying(100), ...

my first approch is

select * from tabl1 where code1 ilike '%code%' or code2 ilike '%code%' or...

then i try

select * from table1 where any(array[code1, code2, ...]) ilike '%code%'

which is not working.

Was it helpful?

Solution

Create an operator that implements ILIKE "backwards", e.g.:

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

(Note that ILIKE internally corresponds to the operator ~~*. Pick your own name for the reverse.)

Then you can run

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

OTHER TIPS

Store email addresses in a normalized table structure. Then you can avoid the expense of unnest, have "proper" database design, and take full advantage of indexing. If you're looking to do full text style queries, you should be storing your email addresses in a table and then using a tsvector datatype so you can perform full text queries AND use indexes. ILIKE '%whatever%' is going to result in a full table scan since the planner can't take advantage of any query. With your current design and a sufficient number of records, unnest will be the least of your worries.

Update Even with the updates to the question, using a normalized codes table will cause you the least amount of headache and result in optimal scans. Anytime that you find yourself creating numbered columns, it's a good indication that you might want to normalize. That being said, you can create a computed text column to use as a search words column. In your case you could create a search_words column that is populated on insert and update by a trigger. Then you can create a tsvector to build full text queries on the search_words

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top