Remove variable length prefix of a string

Remove variable length prefix of a string

In the query shown here, I need to keep the numerical part of the column code1 when it starts with T and concatenate it with code2 to get the code I want.

With other RDBMS, I would have used regex replace. But I am stuck with SQL Server.

I came up with the solution below. Is it optimal? Are there better solutions?

SELECT 
    code1,
    code2,
    CONCAT(ISNULL(CAST(TRY_CAST(REPLACE(code1, 'T', '')  AS int) AS nvarchar), code1), code2) AS concatenated_code
FROM 
    (VALUES
        ('T000001524','A001'),
        ('T000001530','A001'), 
        ('S01','A001'),
        ('T000003705','A001'),
        ('T000000091','A001'),
        ('S09','A004'),
        ('T000000961','A002')
    ) customer (code1, code2)

The output I am looking for is

code1 code2 concatenated_code
T000001524 A001 1524A001
T000001530 A001 1530A001
S01 A001 S01A001
T000003705 A001 3705A001
T000000091 A001 91A001
S09 A004 S09A004
T000000961 A002 961A002

Answer

Assuming you're on SQL Server 2022 (as you don't denote you aren't using the latest version), you could just use a trim function (LTRIM) to remove the leading 'T' and '0' characters:

SELECT code1,
       code2,
       CONCAT(LTRIM(customer.code1,'T0'),customer.code2) AS concatenated_code
FROM (VALUES ('T000001524', 'A001'),
             ('T000001530', 'A001'),
             ('S01', 'A001'),
             ('T000003705', 'A001'),
             ('T000000091', 'A001'),
             ('S09', 'A004'),
             ('T000000961', 'A002')) customer (code1, code2);

Otherwise, I would probably use STUFF and PATINDEX to remove the characters to the first non-T/0 character. This assume that there will be at least one character that isn't T or 0 in code1.

SELECT code1,
       code2,
       CONCAT(STUFF(customer.code1,1,PATINDEX('%[^T0]%',customer.code1)-1,''),customer.code2) AS concatenated_code
FROM (VALUES ('T000001524', 'A001'),
             ('T000001530', 'A001'),
             ('S01', 'A001'),
             ('T000003705', 'A001'),
             ('T000000091', 'A001'),
             ('S09', 'A004'),
             ('T000000961', 'A002')) customer (code1, code2);

As for what is "optimal", you're in the best position to test.

Enjoyed this article?

Check out more content on our blog or follow us on social media.

Browse more articles