我有一个包含帐户代码的字段。我已经设法提取了前两个部分,但我在最后两个部分很吃力。
字段数据如下:
812330/50110/0-0
812330/50110/BDG001-0
812330/50110/0-X001
我需要获得第二个"/"one_answers"-"之间以及"-"之后的字符串。这两个字段都有可变长度,所以我希望在第一条记录上输出0和0,在第二条记录上输入BDG001和0,而在第三条记录上则输出0和X001。
非常感谢您的帮助,谢谢。
您可以使用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
。。。或者你可以这样做,所以你只从左边到右边,这样你就不需要从最后开始计数,以防你有更多的"/"或"-"标志:
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
一种方法是从web上下载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
语句来处理格式错误的数据。