pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Steve Crawford <scrawford@pinpointresearch.com>
To: pgsql-sql@postgresql.org
Subject: Re: how can I replace all instances of a pattern
Date: Tue, 26 Mar 2013 06:22:26 -0700
Message-ID: <5151A112.2030904@pinpointresearch.com> (raw)
In-Reply-To: <CD771612.8A7C%jsharrett@tidemark.net>
References: <CD771612.8A7C%jsharrett@tidemark.net>
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-sql>

On 03/26/2013 06:08 AM, James Sharrett wrote:
> I'm trying remove all instances of non-alphanumeric or underscore 
> characters from a query result for further use.  This is part of a 
> function I'm writing that is in plpgsql
>
> Examples:
>
>   Original value
>     'My text1'
>     'My text 2'
>     'My-text-3'
>     'My_text4'
>     'My!text5'
>
>    Desired
>     'Mytext1'
>     'Mytext2'
>     'Mytext3'
>     'My_text4'  (no change)
>     'Mytext5'
>
>
> The field containing the text is column_name.  I tried the following:
>
>   Select regexp_replace(column_name,'\W','') from mytable
>
> This deals with the correct characters but only does the first 
> instance of the character so the output is:
>
>     'My text1'
>     'Mytext 2'  (wrong)
>     'Mytext-3'  (wrong)
>     'My_text4'
>     'My!text5'
>
> I managed to get the desired output by writing the text into a 
> variable through a loop and then just keep looping on the variable 
> until all the characters are removed:
>
> sql_qry:= 'select column_name from mytable';
>
> for sql_record in execute sql_qry loop
> curr_record := sql_record.column_name;
>
> while length(substring(curr_record from '\W'))>0 loop
> curr_record := regexp_replace(curr_record, '\W','');
> end loop;
>
> .... rest of the code
>
> This works but it seems like a lot of work to do something this simple 
> but I cannot find any function that will replace all instances of a 
> string AND can base it on a regular expression pattern.  Is there a 
> better way to do this in 9.1?

You were on the right track with regexp_replace but you need to add a 
global flag:
regexp_replace(column_name,'\W','','g')

See examples under 
http://www.postgresql.org/docs/9.1/static/functions-matching.html#FUNCTIONS-POSIX-REGEXP

Cheers,
Steve

view thread (5+ messages)  latest in thread

Message-ID: <5151A112.2030904@pinpointresearch.com>
Permalink:  ../5151A112.2030904@pinpointresearch.com/
Also on:    postgresql.org/message-id/5151A112.2030904@pinpointresearch.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: scrawford@pinpointresearch.com
  Subject: Re: how can I replace all instances of a pattern
  In-Reply-To: <5151A112.2030904@pinpointresearch.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox