使用 SQL 在列中分隔字母和数字

问题描述 投票:0回答:1

我有记录,有时带有一个文本和一个数字,有时带有两个、三个或四个,它们用两个点“:”分隔。我想将数字和文本拆分为多列。

这里是一个记录示例: 3月:4月1日:5月2日:6月10日:1

想要的结果:

Str_1 item_1 Str_2 项目_2 Str_3 项目_3 Str_4 item_4
三月 1 四月 2 五月 10 六月 1

我正在使用 SQL SERVER 2012

我制作了这个脚本,但它并不适用于所有情况

select substring(@str,1,charindex(':',@str)-1) as str_Type,

case when  len(@str)-len(replace(@str,':',''))=1 then substring(@str,charindex(':',@str)+1,len(@str)) 
  else substring(ltrim(
                            SUBSTRING(
                                                  substring(replace
                                                                (@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,
                                                                LEN(replace(@str,'-',''))) 
                                                  ,1
                                                  ,CHARINDEX(':',substring(replace
                                                                                            (@str,'-',''),
                                                                                            CHARINDEX(':',replace(@str,'-',''))+1,
                                                                                            LEN(replace(@str,'-',''))))-1))
                                   ,1
                                   ,charindex(' ',ltrim(SUBSTRING(
                                                                                                           substring(replace(
                                                                                                                                @str,'-',''),
                                                                                                                                CHARINDEX(':',replace(@str,'-',''))+1,
                                                                                                                                LEN(replace(@str,'-',''))) 
                                                                                                           ,1
                                                                                                          ,CHARINDEX(':',substring(replace
                                                                                                                                                     (@str,'-',''),
                                                                                                                                                     CHARINDEX(':',replace(@str,'-',''))+1,
                                                                                                                                                     LEN(replace(@str,'-',''))))-1)))-1)
  end as str_Unit,

     case when  len(@str)-len(replace(@str,':',''))=1 then null 
  else substring(ltrim(SUBSTRING(
                            substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))) 
                            ,1
                            ,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1))
              ,charindex(' ',ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1)))+1
              ,len(ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))-1)))) 
  end as str_type_2 ,

  LEFT(case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            CHARINDEX(':',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-','')))))
   End, PATINDEX('%[0-9][^0-9]%', case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            CHARINDEX(':',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-','')))))
   End )) as str_Unit_2,



    case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,len(ltrim(SUBSTRING(substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))) ,1,CHARINDEX(':',substring(replace(@str,'-',''),CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))-1))))))
   End as str_type_3,

              
        reverse(LEFT(reverse(LEFT(case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end, PATINDEX('%[0-9][^0-9]%', case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end ))), PATINDEX('%[0-9][^0-9]%', reverse(LEFT(case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end, PATINDEX('%[0-9][^0-9]%', case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9][^0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end ))) ))) str_Unit_3,


              replace(LTRIM(RIGHT( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end, LEN( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%',  case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end ))),reverse(LEFT(reverse(LTRIM(RIGHT( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end, LEN( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%',  case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end )))), PATINDEX('%[0-9][^0-9]%', reverse(LTRIM(RIGHT( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end, LEN( case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end) - PATINDEX('%[0-9][^0-9]%',  case when  len(@str)-len(replace(@str,':',''))=1 then null
  else SUBSTRING(
                            substring(replace
                            (@str,'-',''),
                            PATINDEX('%[0-9]%',replace(@str,'-',''))+1,
                            LEN(replace(@str,'-','')))
              ,CHARINDEX(':',substring(replace(@str,'-',''),
                                                                CHARINDEX(':',replace(@str,'-',''))+1,LEN(replace(@str,'-',''))))+1,len(substring(replace(@str,'-','')
                                                                ,CHARINDEX(':',replace(@str,'-',''))+1
              ,LEN(replace(@str,'-',''))))) end )))) )+2)),'')  str_Type_4,


    substring( @str,DATALENGTH(@str)-CHARINDEX(REVERSE(':'),REVERSE(@str))+3,len(@str)) as str_Unit_4


Thanks!
sql sql-server sql-server-2012 substring
1个回答
1
投票

我不确定那一大堆乱七八糟的代码应该做什么,但你可以使用

OPENJSON
和一些字符串替换来分割你的文本:

DECLARE @str varchar(max) = 'Text1 : 1 Text2 : 2 Text3 : 10 Text4 : 1';

SELECT
  j.[key],
  LEFT(j.value, v.pipe - 1),
  SUBSTRING(j.value, v.pipe + 1, LEN(j.value))
FROM OPENJSON(
  '["' +
  REPLACE(
    REPLACE(
      @str,
      ' : ',
      '|'
    ),
    ' ',
    '","'
  )
  + '"]'
) j
CROSS APPLY (VALUES (
    CHARINDEX('|', j.value)
) ) v(pipe);

db<>小提琴

如果您希望将其放在一行上,则可以将其聚合。

© www.soinside.com 2019 - 2024. All rights reserved.