提取介于second/之后和-之前的字符串



我有一个包含帐户代码的字段。我已经设法提取了前两个部分,但我在最后两个部分很吃力。

字段数据如下:

812330/50110/0-0  
812330/50110/BDG001-0  
812330/50110/0-X001

我需要获得第二个"/"one_answers"-"之间以及"-"之后的字符串。这两个字段都有可变长度,所以我希望在第一条记录上输出0和0,在第二条记录上输入BDG001和0,而在第三条记录上则输出0和X001。

非常感谢您的帮助,谢谢。

您可以使用CHARINDEXLEFT/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:

使用PARSENAMESQL 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语句来处理格式错误的数据。

最新更新