sqloracle-databasesubstringoracle-apextrim

how to trim, substring and make capital letters in a column


I have a table in oracle apex:

CREATE TABLE Fundusze (
    Id NUMBER(10) NOT NULL,
    Nazwa VARCHAR2(50) NOT NULL,
    Waluta VARCHAR2(50) NOT NULL,
    Typ VARCHAR2(50) NOT NULL,
    CONSTRAINT CHK_StatusFundusze CHECK (Typ IN ('defensywny', 'akcyjny', 'oszczędnościowy')),
    CONSTRAINT PK_IdFundusze PRIMARY KEY (Id)
);

INSERT INTO Fundusze VALUES (1, 'Def1', 'PLN', 'defensywny');
INSERT INTO Fundusze VALUES (2, 'Def2', 'USD', 'defensywny');
INSERT INTO Fundusze VALUES (3, 'Akc1', 'PLN', 'akcyjny');
INSERT INTO Fundusze VALUES (4, 'Akc2', 'USD', 'akcyjny');
INSERT INTO Fundusze VALUES (5, 'Os1', 'PLN', 'oszczędnościowy');
INSERT INTO Fundusze VALUES (6, 'Os2', 'USD', 'oszczędnościowy');
INSERT INTO Fundusze VALUES (7, 'Defensywny2', 'PLN', 'defensywny');
INSERT INTO Fundusze VALUES (8, 'Akcyjny2', 'PLN', 'akcyjny');
INSERT INTO Fundusze VALUES (9, ' Akc3yjny3', 'PLN', 'akcyjny');
INSERT INTO Fundusze VALUES (10, 'Akc4yjny4 ', 'PLN', 'akcyjny');
INSERT INTO Fundusze VALUES (11, ' Akc5yjny5 ', 'PLN', 'akcyjny');
INSERT INTO Fundusze VALUES (12, ' top20', 'PLN', 'defensywny');
INSERT INTO Fundusze VALUES (13, 'low30 ', 'PLN', 'defensywny');
INSERT INTO Fundusze VALUES (14, ' mid40 ', 'PLN', 'defensywny');

I want to make an update on this table values so that the nazwa is trimmed out of spaces, then add a string after the nazwa "MBANK" and then make everything into capital letters. I used the following query

UPDATE Fundusze
SET nazwa = TRIM(UPPER(SUBSTR(nazwa, 0, 4))) || 'MBANK');

but it takes the spaces into the removal and doesn't substring properly, which is what I want. For example last three rows are returned into this:

12  TOPMBANK    
13  LOW3MBANK   
14  MIDMBANK

and I want it to be:

12  TOP2MBANK   
13  LOW3MBANK   
14  MID4MBANK

I tried everything, but failed to do it the way needed.


Solution

  • Trim before taking the sub-string:

    UPDATE Fundusze
    SET nazwa = UPPER(SUBSTR(TRIM(nazwa), 1, 4)) || 'MBANK';
    

    Which, for some minimal example data:

    CREATE TABLE Fundusze (
        Id NUMBER(10) NOT NULL,
        Nazwa VARCHAR2(50) NOT NULL
    );
    
    INSERT INTO Fundusze VALUES (1, 'Def1');
    INSERT INTO Fundusze VALUES (7, 'Defensywny2');
    INSERT INTO Fundusze VALUES (9, ' Akc3yjny3');
    INSERT INTO Fundusze VALUES (10, 'Akc4yjny4 ');
    INSERT INTO Fundusze VALUES (11, ' Akc5yjny5 ');
    INSERT INTO Fundusze VALUES (12, ' top20');
    INSERT INTO Fundusze VALUES (13, 'low30 ');
    INSERT INTO Fundusze VALUES (14, ' mid40 ');
    

    Updates the table to:

    ID NAZWA
    1 DEF1MBANK
    7 DEFEMBANK
    9 AKC3MBANK
    10 AKC4MBANK
    11 AKC5MBANK
    12 TOP2MBANK
    13 LOW3MBANK
    14 MID4MBANK

    fiddle