From: | Charles Clavadetscher <clavadetscher(at)swisspug(dot)org> |
---|---|
To: | Pete Yunker <peter(dot)yunker(at)homejunction(dot)com> |
Cc: | pgsql-general(at)lists(dot)postgresql(dot)org |
Subject: | Re: Help : Removal of leading spaces in all the columns of a table |
Date: | 2020-02-12 14:00:37 |
Message-ID: | 27fa1bb7e5d97c0e376bad79e44c2cf1@swisspug.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
CCing the list.
Hello
On 2020-02-12 14:30, Pete Yunker wrote:
> Shouldn’t the replacement string in regexp_replace be a single space
> instead of a 0-length string?
Yes, correct.
SELECT regexp_replace(upper(trim(txt)),'[ ]{2,}', ' ', 'g') FROM test;
regexp_replace
----------------
ABC
ABC
A B C
A B C
(4 rows)
The 3rd row was not modified correctly in my previous example.
Thank you for pointing out.
And to get back to the OP I saw that he wants a statement for all
columns - I assume of a table.
In this case it is possible to generate the statement using the system
catalogs.
I modified the test table to illustrate this.
\d test
Table "public.test"
Column | Type | Collation | Nullable | Default
--------+-------------------+-----------+----------+---------
txt | text | | |
i | integer | | |
txt2 | character varying | | |
select * from test;
txt | i | txt2
----------------+---+-----------
abc | 1 | de f
abc | 2 | d e f
a b c | 3 | d e f
a b c | 4 | def
(4 rows)
Now create the statement replacing 'test' with the name of the table
that must be processed.
SELECT format($$UPDATE %I.%I SET (%s) = (%s)$$,
c.relnamespace::REGNAMESPACE,
c.relname,
string_agg(a.attname, ', '),
string_agg(format($$regexp_replace(upper(trim(%s)),'[
]{2,}', ' ', 'g')$$, a.attname), ', '))
FROM pg_catalog.pg_attribute a,
pg_catalog.pg_class c
WHERE a.attrelid = c.oid
AND a.atttypid::regtype IN ('text','varchar')
AND a.attnum > 0
AND NOT a.attisdropped
AND c.relname = 'test'
GROUP BY c.relnamespace::regnamespace,
c.relname;
And execute the resulting statement.
UPDATE public.test SET (txt, txt2) = (regexp_replace(upper(trim(txt)),'[
]{2,}', ' ', 'g'), regexp_replace(upper(trim(txt2)),'[ ]{2,}', ' ',
'g'));
Content of the table after the update.
select * from test;
txt | i | txt2
-------+---+-------
ABC | 1 | DE F
ABC | 2 | D E F
A B C | 3 | D E F
A B C | 4 | DEF
(4 rows)
Regards
Charles
>
>> On Feb 12, 2020, at 8:23 AM, Charles Clavadetscher
>> <clavadetscher(at)swisspug(dot)org> wrote:
>>
>> Hello
>>
>> On 2020-02-12 13:42, srikkanth wrote:
>>> Hi Team,
>>> How can i write the syntax to remove the leading spaces on a table
>>> for
>>> all the columns.
>>> Also, want to know how to do the all words of all the columns in
>>> capital along with removing of leading\excessive\trailing spaces at a
>>> time.
>>> Can you please help me out, let me know in case of any inputs.
>>
>> You may combine existing functions:
>>
>> CREATE TABLE test (txt TEXT);
>>
>> INSERT INTO test VALUES ('abc'),(' abc '),(' a b c '),('a
>> b c');
>>
>> SELECT * FROM test;
>> txt
>> ----------------
>> abc
>> abc
>> a b c
>> a b c
>> (4 rows)
>>
>> Now, assuming that "excessive" spaces means that there must be at most
>> one between words:
>>
>> SELECT regexp_replace(upper(trim(txt)),'[ ]{2,}', '', 'g') FROM test;
>> regexp_replace
>> ----------------
>> ABC
>> ABC
>> AB C
>> A B C
>> (4 rows)
>>
>> first you remove all leading and trailing spaces (trim).
>> Then you transform all letters to upper case (upper).
>> Finally you remove all spaces but one between the words
>> (regexp_replace with '[ ]{2,}' meaning 2 or more spaces to be replaced
>> with empty string '' for all occurrences in the string. 'g' means
>> global).
>>
>> The order of the calls is not really relevant for the result.
>>
>> Use UPDATE test SET txt instead of a select if you want to update your
>> table at once.
>> I usually prefer to see the result before I act on the data ;-)
>>
>> Bye
>> Charles
>>
>>> Thanks,
>>> Srikanth B
--
Charles Clavadetscher
Swiss PostgreSQL Users Group
Treasurer
Spitzackerstrasse 9
CH - 8057 Zürich
+---------------------------+
| ____ ______ ___ |
| / )/ \/ \ |
| ( / __ _\ ) |
| \ (/ o) ( o) ) |
| \_ (_ ) \ ) _/ |
| \ /\_/ \)/ |
| \/ <//| |\\> |
| _| | |
| \|_/ |
| |
| Swiss PGDay 2020 |
| 18/19.06.2020 |
| HSR Rapperswil |
| |
+---------------------------+
From | Date | Subject | |
---|---|---|---|
Next Message | Susan Hurst | 2020-02-12 14:09:28 | Re: Help : Removal of leading spaces in all the columns of a table |
Previous Message | Charles Clavadetscher | 2020-02-12 13:23:35 | Re: Help : Removal of leading spaces in all the columns of a table |