我有一列包含三组数据的列,这些数据由正斜杠分隔,例如
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
我希望我的问题很清楚,希望我能向正确的方向提出建议,谢谢。
答案 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