2014-01-30 51 views
1

我正在尋找從SQL表中的註釋字段中只提取一部分字符串。當前字符串如下所示:「TN:mba卡車運輸| HR:cf82267 | TR:solomon | AI:| N/A」。我想要做的是從TN中選擇任何東西:直到下一個管道。然後我想從HR選擇任何東西:直到下一個管道。請注意,這些參數之間的數據並不總是相同的長度,因此不能使用SUBSTRING在兩個已知字符串元素之間選擇SQL字段的一部分

+0

請問哪個RDBMS。對於Sql-Server,請參見[這裏](http://stackoverflow.com/questions/2647/split-string-in-sql) – StuartLC

+0

哪個數據庫? Oracle,SQLServer,MySQL? – Incognito

+0

對於Oracle請看[instr](http://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_functions_1103.htm) – Streuner

回答

0

例如:

我寫了這個代碼給我弄一個字符串

SELECT DISTINCT A.REZ FROM 
(
    SELECT REGEXP_SUBSTR('1213-1201+1202+1203+1204+1205+1206+1207+1208+1209+1210+1211', '[0-9]+', 1, LEVEL) AS REZ FROM dual 
    CONNECT BY REGEXP_SUBSTR('1213-1201+1202+1203+1204+1205+1206+1207+1208+1209+1210+1211', '[0-9]+', 1, LEVEL) IS NOT NULL 
) A; 

你可以寫你的正則表達式從每個管之間得到裏面的話號碼列表

所以,它會是這樣的:

SELECT A.REZ FROM 
(
    SELECT REGEXP_SUBSTR(Your_Var, Your_Regular_Expression, 1, LEVEL) AS REZ FROM dual 
    CONNECT BY REGEXP_SUBSTR(Your_Var, Your_Regular_Expression, 1, LEVEL) IS NOT NULL 
) A; 

Your_Var將持有你想

而且Your_Regular_Expression工作將是您需要構建能夠滿足您的需求

注意正則表達式的文字:這是Oracle SQL語法

0

對於Oracle你可以使用instrsubstr,根據不同的強度靈活。在我的例子中,我沒有創建一個表,我可以從中選擇你的samplestring。因此它有點笨重。如果你可以使用普通的字段名而不是重複字符串,它看起來會更緊湊。

SELECT SUBSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A', 
      INSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A', 'TN:'), 
      INSTR('TN:mba trucking|HR:cf82267|TR:solomon|AI:|N/A', '|') - 1) 
    FROM dual; 

我包括-1切割管關閉。如果你願意,你也可以減少關閉。這是一個非常基本的方式,而不是最好的解決方案。如果文本包含instr-function中要查找的一些關鍵字,則會出現問題。根據整體情況,使用一些正則表達式可能是明智的,比如之前提到的simsim。

相關問題