2015-11-07 24 views
1

我有一個包含帳戶代碼的字段。我已經成功地提取前兩個部分確定的,但我用最後2在第二個/之後提取字符串 -

的字段數據如下努力:

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

我需要獲得第二之間的字符串「/ 「和」 - 「之後和」 - 「之後。兩個字段的長度都是可變的,所以我會在第一條記錄上輸出0和0,在第二條記錄上輸出BDG001和0,在第三條記錄上輸出0和X001。

任何幫助非常感謝,謝謝。

+0

是代碼的前半部分固定長度嗎?直到第二個斜線? – shawnt00

回答

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:

使用PARSENAMESQL SERVER 2012+(如果你的數據不包含.):

SELECT 
    col, 
    sub1 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 2), 
    sub2 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 1) 
FROM #tab; 

LiveDemo3

+0

難道你不需要第二次逆轉嗎? – shawnt00

+0

@ shawnt00反轉僅用於獲得第二個'/'字符。 – lad2025

+0

我的不好。我想我的藉口是這款手機的小屏幕:) – shawnt00

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語句來處理代碼錯誤的數據。

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 
相關問題