Search Postgresql Archives

Re: How to search ignoring spaces and minus signs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



select regexp_replace(myval, E'(\\D)', '', 'g') from foo;

for added speed, you might consider this:
CREATE INDEX ON foo((regexp_replace(myval, E'(\\D)', '', 'g'))::bigint);


which is also going to protect you against inserts where value doesn't
contain any digits.

and added benefit of index:
gj=# select * from foo where (regexp_replace(myval::text,
'(\D)'::text, ''::text, 'g'::text)::bigint) = 5656;
 id | myval
----+-------
 61 | 56-56
(1 row)

Time: 1.356 ms
gj=# explain select * from foo where (regexp_replace(myval::text,
'(\D)'::text, ''::text, 'g'::text)::bigint) = 5656;
                                            QUERY PLAN
---------------------------------------------------------------------------------------------------
 Index Scan using foo_regexp_replace_idx on foo  (cost=0.01..8.38
rows=1 width=17)
   Index Cond: ((regexp_replace((myval)::text, '(\D)'::text, ''::text,
'g'::text))::bigint = 5656)
(2 rows)

gj=# \d+ foo
                                             Table "public.foo"
 Column |         Type          |                    Modifiers
            | Storage  | Description
--------+-----------------------+--------------------------------------------------+----------+-------------
 id     | integer               | not null default
nextval('foo_id_seq'::regclass) | plain    |
 myval  | character varying(20) | not null
            | extended |
Indexes:
    "foo_pkey" PRIMARY KEY, btree (id)
    "foo_regexp_replace_idx" btree ((regexp_replace(myval::text,
'(\D)'::text, ''::text, 'g'::text)::bigint))
Has OIDs: no


or even create a view that would allow you to make it nice and easy:
gj=# CREATE VIEW foo_view AS select id, (regexp_replace(myval::text,
'(\D)'::text, ''::text, 'g'::text)::bigint) AS int_val FROM foo;
CREATE VIEW

gj=# select * from foo_view where int_val = 1212;
 id | int_val
----+---------
 17 |    1212
(1 row)

Time: 0.709 ms
gj=# explain select * from foo_view where int_val = 1212;
                                            QUERY PLAN
---------------------------------------------------------------------------------------------------
 Index Scan using foo_regexp_replace_idx on foo  (cost=0.01..8.39
rows=1 width=17)
   Index Cond: ((regexp_replace((myval)::text, '(\D)'::text, ''::text,
'g'::text))::bigint = 1212)
(2 rows)


HTH

-- 
GJ

-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux