我有一個包含帳戶代碼的字段。我已經成功地提取前兩個部分確定的,但我用最後2在第二個/之後提取字符串 -
的字段數據如下努力:
812330/50110/0-0
812330/50110/BDG001-0
812330/50110/0-X001
我需要獲得第二之間的字符串「/ 「和」 - 「之後和」 - 「之後。兩個字段的長度都是可變的,所以我會在第一條記錄上輸出0和0,在第二條記錄上輸出BDG001和0,在第三條記錄上輸出0和X001。
任何幫助非常感謝,謝謝。
我有一個包含帳戶代碼的字段。我已經成功地提取前兩個部分確定的,但我用最後2在第二個/之後提取字符串 -
的字段數據如下努力:
812330/50110/0-0
812330/50110/BDG001-0
812330/50110/0-X001
我需要獲得第二之間的字符串「/ 「和」 - 「之後和」 - 「之後。兩個字段的長度都是可變的,所以我會在第一條記錄上輸出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;
編輯:
或更簡單:
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;
編輯2:
使用PARSENAME
SQL SERVER 2012+(如果你的數據不包含.
):
SELECT
col,
sub1 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 2),
sub2 = PARSENAME(REPLACE(REPLACE(col, '/', '.'), '-', '.'), 1)
FROM #tab;
一種方法是從網上下載一個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
語句來處理代碼錯誤的數據。
...或者你可以做到這一點,所以你只能從左側向右走,所以你不需要從末端計數的情況下,你有更多的「/」或「 - 」符號:
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
是代碼的前半部分固定長度嗎?直到第二個斜線? – shawnt00