在秒之后和之前提取字符串 -

时间:2015-11-07 13:29:17

标签: sql sql-server tsql

我有一个包含帐户代码的字段。我设法提取了前两部分,但是我在最后两部分中挣扎。

现场数据如下:

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

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

非常感谢任何帮助,谢谢。

3 个答案:

答案 0 :(得分:1)

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

使用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语句来填充代码以处理格式错误的数据。