我有一個字符串:使用SQL與多個背提取字符斜線
\_AAA\DDDD\09090\longtest
我怎麼能只提取字符串09090
?
會有很多像這樣的字符串,我想提取第三個和第四個反斜槓之間的字符串。
我有一個字符串:使用SQL與多個背提取字符斜線
\_AAA\DDDD\09090\longtest
我怎麼能只提取字符串09090
?
會有很多像這樣的字符串,我想提取第三個和第四個反斜槓之間的字符串。
我會咬人。下面是抓住什麼是在第三場的Oracle解決方案:
select regexp_substr('\_AAA\DDDD\09090\longtest', '[^\]+', 1, 3) from dual;
技術上講,它抓住了一個字符集不匹配反斜線的第三節比賽。
我剛剛意識到它不允許空字段。
這工作:
select nvl(regexp_substr(str, '([^\\]*)\\{0,1}', 1, level, 'i', 1), 'null') part
from (select '\_AAA\DDDD\09090\longtest' str from dual)
where level = 4
connect by level <= regexp_count(str, '\') + 1;
從這裏:
SQL Server的一個簡單的(雖然不一定有效)的解決方案是:
SELECT Substring(text, first, second - first)
FROM (SELECT text,
Charindex('\', text, Charindex('\', text, Charindex('\', text)+1)
+1)
+ 1 first,
Charindex('\', text, Charindex('\', text, Charindex('\', text,
Charindex
('\',
text)+1)+1)
+ 1) second
FROM table1)T
見工作例如SQL Fiddle
編輯
更好的答案應該使用遞歸查詢。
嘗試這樣:
WITH A
AS (SELECT CAST(0 AS BIGINT) AS idx1,
CHARINDEX('\', TEXT) idx2,
TEXT,
0 AS rn
FROM TABLE1
UNION ALL
SELECT CAST(IDX2 + 1 AS BIGINT),
CHARINDEX('\', TEXT, IDX2 + 1),
TEXT,
RN + 1
FROM A
WHERE IDX2 > 0)
SELECT SUBSTRING(TEXT, IDX1, IDX2 - IDX1)
FROM A
WHERE RN = 3
這是好多了,因爲你可以很容易地適應它來提取字符串的任何部分,不只是第三。
參見本上SQL Fiddle
3個問題的工作示例:是每組\相同長度或可變長度的之間的文本?是第四個\總是最後一個?最後是什麼RDBMS?所有的SQL都不一樣。 – xQbert
你的RDBMS是什麼?你想要純粹的SQL解決方案,還是說,你可以說,C#? –