【问题标题】:Better SQL Query to split alphanumeric string based on pattern更好的 SQL 查询来根据模式拆分字母数字字符串
【发布时间】:2015-02-19 10:49:43
【问题描述】:

我需要如下拆分字母数字字符串,例如“20A30D40I10O”。允许的字符:A,D,I,O 任意顺序及其对应的百分比。

+------+------+ |科尔A |科尔B | +------+------+ | 20 |一个 | | 30 | D | | 40 |我 | | 10 | ○ | +------+------+

我曾尝试编写相同的查询。

声明@Val Varchar(100) 设置@Val = '20A30D40I10O' 声明 @origTable 表(名称 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'

【问题讨论】:

  • 它们总是采用这种格式吗?百分比、字母、百分比等。
  • 是的.. 它将仅采用 PLPLPLPL 格式(P-百分比,L-字母)。字母是 A,D,I,O

标签: sql sql-server sql-server-2008


【解决方案1】:

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 

【讨论】:

    【解决方案2】:

    我做了一个解决方法。但我知道为时已晚。我只是想分享我所做的想法。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 2020-10-05
      相关资源
      最近更新 更多