how can I replace all instances of a pattern

From: James Sharrett <jsharrett(at)tidemark(dot)net>
To: <pgsql-sql(at)postgresql(dot)org>
Subject: how can I replace all instances of a pattern
Date: 2013-03-26 13:08:34
Message-ID: CD771612.8A7C%jsharrett@tidemark.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

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?

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message James Sharrett 2013-03-26 13:13:39 Re: how can I replace all instances of a pattern
Previous Message Pavel Stehule 2013-03-26 08:08:26 Re: From with case