Re: Help : Removal of leading spaces in all the columns of a table - Mailing list pgsql-general
From | Charles Clavadetscher |
---|---|
Subject | Re: Help : Removal of leading spaces in all the columns of a table |
Date | |
Msg-id | 27fa1bb7e5d97c0e376bad79e44c2cf1@swisspug.org Whole thread Raw |
In response to | Help : Removal of leading spaces in all the columns of a table ("srikkanth" <srikkanth16081991@rediffmail.com>) |
List | 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@swisspug.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 http://www.swisspug.org +---------------------------+ | ____ ______ ___ | | / )/ \/ \ | | ( / __ _\ ) | | \ (/ o) ( o) ) | | \_ (_ ) \ ) _/ | | \ /\_/ \)/ | | \/ <//| |\\> | | _| | | | \|_/ | | | | Swiss PGDay 2020 | | 18/19.06.2020 | | HSR Rapperswil | | | +---------------------------+
pgsql-general by date: