更好的 SQL 查询以根据模式拆分字母数字字符串
Better SQL Query to split alphanumeric string based on pattern
我需要拆分字母数字字符串,例如“20A30D40I10O”,如下所示。允许出现的字符:A,D,I,O任意顺序及其对应的百分比。
+------+------+
|可乐 |科尔B |
+------+------+
| 20 |一个|
| 30 | D |
| 40 |我 |
| 10 |欧 |
+------+------+
我曾尝试编写相同的查询。
声明@Val Varchar(100)
设置@Val = '20A30D40I10O'
声明 @origTable TABLE(名称 VARCHAR(1000))
插入@origTable(名称)值(@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')
联合所有
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')
联合所有
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')
联合所有
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')
但是如果字符串包含 1 位百分比,则此查询不足以拆分字符串。例如:'98D2O'
使用 while
循环和一些 string
函数。可能不是最好的方法,但应该有效。试试这个。
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
我解决了这个问题。但我知道的已经晚了。我只想分享我所做的想法。
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
我需要拆分字母数字字符串,例如“20A30D40I10O”,如下所示。允许出现的字符:A,D,I,O任意顺序及其对应的百分比。
+------+------+ |可乐 |科尔B | +------+------+ | 20 |一个| | 30 | D | | 40 |我 | | 10 |欧 | +------+------+
我曾尝试编写相同的查询。
声明@Val Varchar(100) 设置@Val = '20A30D40I10O' 声明 @origTable TABLE(名称 VARCHAR(1000)) 插入@origTable(名称)值(@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') 联合所有 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') 联合所有 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') 联合所有 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')
但是如果字符串包含 1 位百分比,则此查询不足以拆分字符串。例如:'98D2O'
使用 while
循环和一些 string
函数。可能不是最好的方法,但应该有效。试试这个。
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
我解决了这个问题。但我知道的已经晚了。我只想分享我所做的想法。
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