我有一个包含帐户代码的字段。我设法提取了前两部分,但是我在最后两部分中挣扎。
现场数据如下:
812330/50110/0-0
812330/50110/BDG001-0
812330/50110/0-X001
我需要在第二个" /"之间获取字符串。和" - "之后" - " 。两个字段都有可变长度,所以我希望在第一条记录上输出0和0,在第二条记录上输出BDG001和0,在第三条记录上输出0和X001。
非常感谢任何帮助,谢谢。
答案 0 :(得分:1)
您可以使用CHARINDEX
和LEFT/RIGHT
:
CREATE TABLE #tab(col VARCHAR(1000));
INSERT INTO #tab VALUES ('812330/50110/0-0'),('812330/50110/BDG001-0'),
('812330/50110/0-X001');
WITH cte AS
(
SELECT
col,
r = RIGHT(col, CHARINDEX('/', REVERSE(col))-1)
FROM #tab
)
SELECT col,
r,
sub1 = LEFT(r, CHARINDEX('-', r)-1),
sub2 = RIGHT(r, LEN(r) - CHARINDEX('-', r))
FROM cte;
的 LiveDemo
强>
修改强>
甚至更简单:
SELECT
col
,sub1 = SUBSTRING(col,
LEN(col) - CHARINDEX('/', REVERSE(col)) + 2,
CHARINDEX('/', REVERSE(col)) -CHARINDEX('-', REVERSE(col))-1)
,sub2 = RIGHT(col, CHARINDEX('-', REVERSE(col))-1)
FROM #tab;
的 LiveDemo2
强>
编辑2:
使用PARSENAME
SQL SERVER 2012 + (如果您的数据不包含.
):
SELECT
col,
sub1 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 2),
sub2 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 1)
FROM #tab;
的 LiveDemo3
强>
答案 1 :(得分:1)
...或者你可以这样做,所以你只能从左到右,所以你不需要从最后开始计算,以防你有更多的' /'或者' - '体征:
SELECT
SUBSTRING(columnName, CHARINDEX('/' , columnName, CHARINDEX('/' , columnName) + 1) + 1,
CHARINDEX('-', columnName) - CHARINDEX('/' , columnName, CHARINDEX('/' , columnName) + 1) - 1) AS FirstPart,
SUBSTRING(columnName, CHARINDEX('-' , columnName) + 1, LEN(columnName)) AS LastPart
FROM table_name
答案 2 :(得分:0)
一种方法是从网上下载split()
功能并使用它。但是,值最终位于单独的行中,而不是单独的列。另一种方法是一系列嵌套子查询,CTE或outer applies
:
select t.*, p1.part1, p12.part2, p12.part3
from table t outer apply
(select t.*,
left(t.field, charindex('/', t.field)) as part1,
substring(t.field, charindex('/', t.field) + 1) as rest1
) p1 outer apply
(select left(p1.rest1, charindex('/', p1.rest1) as part2,
substring(p1.rest1, charindex('/', p1.rest1) + 1, len(p1.rest1)) as part3
) p12
where t.field like '%/%/%';
where
子句保证字段值的格式正确。否则,您需要开始使用case
语句来填充代码以处理格式错误的数据。