定界符上的T-SQL拆分列

时间:2018-06-28 20:42:34

标签: sql sql-server tsql sql-server-2012

我有一列包含三组数据的列,这些数据由正斜杠分隔,例如

AB/1234/10

该列在每一行中的格式总是相同的,包括2个字符,一个斜杠,一定数量的字符,一个斜杠,然后还有2个字符。我需要将这一栏分为三部分。所以上面的例子变成了

Column1 Column2 Column3
AB      1234    10

我不太确定该怎么做。我一直在使用SELECT SUBSTRING,但这并不能满足我的需求。

select SUBSTRING(MyColumn, 1, CHARINDEX('/', MyColumn, 1)-1) 
FROM MyTable

将返回AB,这很好。但是,我无法确定如何抓住中间部分和末尾部分。我以为

select SUBSTRING(MyColumn, 4, CHARINDEX('/', MyColumn, 4)) 
FROM MyTable

可以抓住中间位置,但是返回1234/10

我希望我的问题很清楚,希望我能向正确的方向提出建议,谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用固定偏移量,因为您已定义字符串始终以两个开头,并以两个字符结尾。

这是一个完整的示例:

DECLARE @tmp TABLE (
  Merged nvarchar(max)
)

INSERT INTO @tmp SELECT N'AB/1234/10'
INSERT INTO @tmp SELECT N'AB/ANYNUMBEROF-CHARACTERS/10'

SELECT
  LEFT(Merged,2) AS Column1,
  SUBSTRING(Merged,4,LEN(Merged)-6) AS Column2,
  RIGHT(Merged,2) AS Column3
FROM @tmp

我们减去字符串的长度减去一个常数(6 =剩下两个字符,右边两个字符,两个斜杠)以从中间提取可变长度部分。

结果:

Column1 Column2                Column3
AB      1234                   10
AB      ANYNUMBEROF-CHARACTERS 10

答案 1 :(得分:1)

一种方法是使用PARSENAME

SELECT PARSENAME(REPLACE('AB/1234/10','/','.'), 3) Col1,
       PARSENAME(REPLACE('AB/1234/10','/','.'), 2) Col2,
       PARSENAME(REPLACE('AB/1234/10','/','.'), 1) Col3

这将用/替换.,并用PARSENAME拉出字符串的每个部分。

好处是它将可以在任何位置使用任何长度的字符。限制是PARSENAME最多只能处理4个位置(在这种情况下,您使用的是3个),并且如果字符串中已经存在句点.,则会失败。

答案 2 :(得分:0)

尝试一下。这应该可以使用任意数量的字符。

DECLARE @str VARCHAR(100) = 'AB/1234/10'

SELECT LEFT(@str, CHARINDEX('/', @str) - 1) AS Column1
    , SUBSTRING(@str, CHARINDEX('/', @str) + 1, CHARINDEX('/', SUBSTRING(@str, CHARINDEX('/', @str) + 1, LEN(@str))) - 1) AS Column2
    , RIGHT(@str, CHARINDEX('/', REVERSE(@str)) - 1) AS Column3