Reputation: 1622
I need to split alphanumeric strings like '20A30D40I10O' as below. The characters which are allowed : A,D,I,O in any order and its corresponding percentage.
+------+------+ | ColA | ColB | +------+------+ | 20 | A | | 30 | D | | 40 | I | | 10 | O | +------+------+
I had tried to write the query for the same.
DECLARE @Val Varchar(100) set @Val = '20A30D40I10O' DECLARE @origTable TABLE(name VARCHAR(1000)) INSERT INTO @origTable(name) VALUES(@Val) SELECT SUBSTRING(name,1,2),SUBSTRING(name,3,1)FROM @origTable where name LIKE '%[0-9][0-9]%' and (SUBSTRING(name,3,1) LIKE 'A' OR SUBSTRING(name,3,1) LIKE 'D' OR SUBSTRING(name,3,1) LIKE 'I' OR SUBSTRING(name,3,1) LIKE 'O') UNION ALL SELECT SUBSTRING(name,4,2),SUBSTRING(name,6,1) FROM @origTable where name LIKE '%[0-9][0-9]%' and (SUBSTRING(name,6,1) LIKE 'A' OR SUBSTRING(name,6,1) LIKE 'D' OR SUBSTRING(name,6,1) LIKE 'I' OR SUBSTRING(name,6,1) LIKE 'O') UNION ALL SELECT SUBSTRING(name,7,2),SUBSTRING(name,9,1) FROM @origTable where name LIKE '%[0-9][0-9]%' and (SUBSTRING(name,9,1) LIKE 'A' OR SUBSTRING(name,9,1) LIKE 'D' OR SUBSTRING(name,9,1) LIKE 'I' OR SUBSTRING(name,9,1) LIKE 'O') UNION ALL SELECT SUBSTRING(name,10,2),SUBSTRING(name,12,1) FROM @origTable where name LIKE '%[0-9][0-9]%' and (SUBSTRING(name,12,1) LIKE 'A' OR SUBSTRING(name,12,1) LIKE 'D'OR SUBSTRING(name,12,1) LIKE 'I' OR SUBSTRING(name,12,1) LIKE 'O')
But this query is not sufficient for splitting the string if it contains 1 digit percentages. eg: '98D2O'
Upvotes: 0
Views: 2410
Reputation: 3492
I made a work around. But it is late I know. I just want to share the idea what I done.
CREATE TABLE #Temp(ColA INT, ColB VARCHAR(20))
DECLARE @TempString VARCHAR(100)
SET @TempString = '20A30D40I10O'
DECLARE @TempVAL VARCHAR(10)
DECLARE @Position INT
DECLARE @Col1Val VARCHAR(10)
SET @Position = 1
WHILE (@Position <= LEN(@TempString))
BEGIN
SET @TempVAL = SUBSTRING(@TempString, @Position, 1)
IF(ISNUMERIC(@TempVAL) = 1)
SET @Col1Val = ISNULL(@Col1Val, '') + @TempVAL
ELSE
BEGIN
INSERT INTO #Temp VALUES(@Col1Val, @TempVAL)
SET @Col1Val = NULL
END
SET @Position = @Position + 1
END
SELECT * FROM #Temp
Upvotes: 0
Reputation: 93724
Use while
loop with some string
functions. Might not be the best way to do it but should work. Try this.
DECLARE @Val VARCHAR(100),@cnt INT =1,@temp VARCHAR(50),@len INT,@intr INT=1
SET @Val = '20A30D40I10O'
SET @len = Len(@Val)
DECLARE @origTable TABLE
(name VARCHAR(1000))
WHILE @cnt <= @len
BEGIN
SET @temp =Substring(@Val, @cnt, 1)
IF @temp LIKE '[a-z]'
BEGIN
INSERT INTO @origTable
SELECT Substring(@Val, @intr, ( @cnt - @intr ) + 1)
SET @intr = @cnt + 1
END
SET @cnt=@cnt + 1
END
SELECT LEFT(name, Patindex('%[a-z]%', name) - 1) Cola,
Substring(name, Patindex('%[a-z]%', name), Len(name)) Colb
FROM @origTable
Upvotes: 1