--===== This just creates demonstrable test data and is NOT part of the solution SET NOCOUNT ONDECLARE @TestData TABLE(String VARCHAR(10)) INSERT INTO @TestData (String) SELECT 'A012' UNION ALL SELECT 'A12' UNION ALL SELECT '12' UNION ALL SELECT '1' UNION ALL SELECT 'AB12' UNION ALL SELECT 'AB2'--===== This is the solution for the known constraints on the data as posted SELECT Original = String, Modified = CASE WHEN d.LastLetter = 0 THEN RIGHT('0000'+d.String,4) WHEN d.LastLetter = 1 THEN LEFT(d.String,d.LastLetter) + RIGHT('0000'+SUBSTRING(d.String,d.FirstDigit,4),3) WHEN d.LastLetter = 2 THEN LEFT(d.String,d.LastLetter) + RIGHT('0000'+SUBSTRING(d.String,d.FirstDigit,4),2) END FROM (--==== Derived table "d" finds the interface between letters/digits SELECT String, LastLetter = PATINDEX('%[a-z][0-9]%',String), FirstDigit = PATINDEX('%[0-9]%',String) FROM @TestData )dRESULTS:=======Original Modified ---------- ------------- A012 A012A12 A01212 00121 0001AB12 AB12AB2 AB02
--===== This just creates demonstrable test data and is NOT part of the solution SET NOCOUNT ONDECLARE @TestData TABLE(String VARCHAR(10)) INSERT INTO @TestData (String) SELECT 'A012' UNION ALL SELECT 'A12' UNION ALL SELECT '12' UNION ALL SELECT '1' UNION ALL SELECT 'AB12' UNION ALL SELECT 'AB2'--===== This is the solution for the known constraints on the data as postedDECLARE @MaxWidth TINYINT SET @MaxWidth = (SELECT MAX(LEN(String)) FROM @TestData) SELECT Original = String, Modified = LEFT(d.String,d.LastLetter) + RIGHT('0000'+SUBSTRING(d.String,d.FirstDigit,4),@MaxWidth-d.LastLetter) FROM (--==== Derived table "d" finds the interface between letters/digits SELECT String, LastLetter = PATINDEX('%[a-z][0-9]%',String), FirstDigit = PATINDEX('%[0-9]%',String) FROM @TestData )dRESULTS:========Original Modified ---------- ------------------ A012 A012A12 A01212 00121 0001AB12 AB12AB2 AB02
SELECT string Original ,CASE WHEN ISNUMERIC(string) = 0 THEN LEFT(string, PATINDEX('%[0-9]%',string)-1) ELSE '' END -- Characters first + REPLICATE('0', 4-LEN(string)) -- Stuff with zeros + SUBSTRING(string, PATINDEX('%[0-9]%',string), 4) -- Add numeric remainder AS ModifiedFROM @TestData
--===== This is the solution for the known constraints on the data as postedDECLARE @MaxWidth TINYINT SET @MaxWidth = (SELECT MAX(LEN(String)) FROM @TestData) SELECT Original = String, Modified = LEFT(d.String,d.LastLetter) + RIGHT( REPLICATE('0',@MaxWidth) + SUBSTRING(d.String,d.LastLetter+1,@MaxWidth) , @MaxWidth-d.LastLetter) FROM (--==== Derived table "d" finds the interface between letters/digits SELECT String, LastLetter = PATINDEX('%[a-z][0-9]%',String+'0') FROM @TestData )d
SELECT string Original ,CASE WHEN PATINDEX('%[0-9]%',string) > 0 THEN LEFT(string, PATINDEX('%[0-9]%',string)-1) ELSE RTRIM(string) END -- Characters first + REPLICATE('0', 4-LEN(string)) -- Stuff with zeros + CASE WHEN PATINDEX('%[0-9]%',string) > 0 THEN SUBSTRING(string, PATINDEX('%[0-9]%',string), 4) ELSE '' END -- Numeric Trailer AS ModifiedFROM @TestData
--===== This just creates demonstrable test data and is NOT part of the solutionSET NOCOUNT ONDECLARE @TestData TABLE(String VARCHAR(10))INSERT INTO @TestData (String)SELECT 'A012' UNION ALLSELECT 'A12' UNION ALLSELECT '12' UNION ALLSELECT '1' UNION ALLSELECT 'AB12' UNION ALLSELECT 'AB2' UNION ALLSELECT 'A' UNION ALLSELECT '' UNION ALLSELECT 'A14' UNION ALLSELECT 'B2' UNION ALLSELECT 'OBT' UNION ALLSELECT 'YH3' UNION ALLSELECT 'XX'--===== This is the solution for the known constraints on the data as postedDECLARE @MaxWidth TINYINT SET @MaxWidth = (SELECT MAX(LEN(String)) FROM @TestData) SELECT Original = String, Modified = LEFT(d.String,d.LastLetter) + RIGHT( REPLICATE('0',@MaxWidth) + SUBSTRING(d.String,d.LastLetter+1,@MaxWidth) , @MaxWidth-d.LastLetter) FROM (--==== Derived table "d" finds the interface between letters/digits SELECT String, LastLetter = PATINDEX('%[a-z][0-9]%',String+'0') FROM @TestData )d