【问题标题】:SQL server split string into columns by delimiter (dynamic length) [duplicate]SQL Server按分隔符将字符串拆分为列(动态长度)[重复]
【发布时间】:2020-03-09 03:37:25
【问题描述】:

SQL 服务器不能使用 MySQL 的 split_index 函数,并且我的环境面临可访问性阻塞,无法在服务器上使用某些函数,例如 "CREATE" "INSERT"

有什么方法可以通过固定分隔符将字符串拆分成列吗? 有 3 个分隔符,但长度是动态的。 例如 字符串:有时 - "AA.0.HJ",有时 - "AABBCC.099.0",有时 - "0.91.JAH21"

子字符串的组合不起作用。

SUBSTRING(STRING , 
            CHARINDEX('.', STRING )+1, 
            LEN(STRING )-CHARINDEX('.', STRING )
Origin:
STRING 
AA.0.HJ
AABBCC.099.0
0.91.JAH21

Target :
STRING        First    Second  Third
AA.0.HJ       AA       0       HJ
AABBCC.099.0  AABBCC   099     0
0.91.JAH21    0        91      JAH21

这种情况有什么解决办法?

【问题讨论】:

  • 对于像您的示例数据这样简单的事情,我将使用下面的 PARSENAME 解决方案。

标签: sql sql-server split


【解决方案1】:

你可以使用解析名称

Declare @t table (name varchar(50))

insert into @t values ('AA.0.HJ')
insert into @t values ('AABBCC.099.0')

select parsename(name,3),parsename(name,2),parsename(name,1) from @t

【讨论】:

  • 感谢您的回答,但在我的真实表和列上应用 select parsename(name,x) 时,我得到所有 NULL 值返回。是否应该对此添加一些数据类型更改?
【解决方案2】:

基于 xml 的解决方案

declare @tmp table (STRING varchar(500))

insert into @tmp
values
 ('AA.0.HJ')
,('AABBCC.099.0')
,('0.91.JAH21')

;WITH Splitted
AS (
    SELECT STRING
        ,CAST('<x>' + REPLACE(STRING, '.', '</x><x>') + '</x>' AS XML) AS Parts
    FROM @tmp
    )
SELECT STRING
    ,Parts.value(N'/x[1]', 'varchar(50)') AS [First]
    ,Parts.value(N'/x[2]', 'varchar(50)') AS [Second]
    ,Parts.value(N'/x[3]', 'varchar(50)') AS [Third] 
FROM Splitted;

输出:

【讨论】:

  • 感谢安德里亚,它是一个绝妙的方法,但如何将表格中的真实列应用到“值”中?当我从 WITH 语句中放置部分时,不知道在“Parts.xxxx”之后放置什么,因为在“Parts.REAL_COLUMN”之后放置真实列名会出错
  • 工作过,安德里亚。通过将 SELECT REA_COLUMN.value(N'/x[1]', 'varchar(50)') as [first] 放在 CAST() XML 链的引号 't' 之后。完美
猜你喜欢
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 2021-04-27
相关资源
最近更新 更多