2013-12-09 75 views
1

在我的數據庫oracle 10g中,我有一個包含引用的字段。拆分字符串的一部分的最大值

它存儲爲:名稱/年/月/號

新的電話號碼,在部分毫米/號找到了最大數量。

所以,現在,我有我的字符串的分割,讓我這個樣子str_array的列表:

str_array(名稱,YYYY,MM,號碼)我想

,與這個,找到最大數量,這對夫婦毫米/數量。

這可能嗎?

我能有這樣的事情:

SELECT MAX(split(reference, '/').lastPartOfArray) into nb 
     FROM table 
where lastPartOfArray-1 = sysdate.month; 

數據樣本:

Smith/2013/12/1 
Smith/2013/11/1 
Smith/2013/12/3 
Jones/2013/12/6 
Smith/2013/12/3 
Jones/2013/11/7 

由於我們是在本月12日,對這些數據的最大值必須在6給我到NB。

的數字部分,沒有限制,可以是1000,10000 ...

的部分瓊斯/ 2013並不重要的數字。但是一個月我不能擁有相同的號碼。

我的歉意,我不知道這是否可能,所以我試圖寫在查詢中我想要的。

這是可能的,還是應該在我的表格中創建多個字段(name/yyyymm,number)?

編輯:VALEX答案和一些定製

select MAX(CAST(SUBSTR(num,INSTR(num,'/')+9,1000) as Int)) 
from T 
where num like TO_CHAR(sysdate,'%/YYYY/MM/%') 

所以這個,算上搜索第一次出現。

select MAX(CAST(SUBSTR(num,INSTR(num,'/',1 ,n)+1,1000) as Int)) 
from T 
where num like TO_CHAR(sysdate,'%/YYYY/MM/%') 

這發現了字符的出現。

這是一個有用的解決方案,在其他情況下。

+0

你能發佈樣本數據和期望的結果嗎? –

+0

儘管這種情況很可能在某種程度上可能,但你真的應該在你的表中分割你的值。意思是,爲每個值創建一個列! – Armunin

+0

@JorgeCampos:添加一些數據樣本。 –

回答

1

要獲得最大的,你應該最後一部分轉換成INT值,否則,你可以得到,不是因爲比較字符串規則正確的結果將被使用。 只要/YYYY/MM/得到了固定的長度= 9,所以我們可以找到第一個\的位置,並添加9到這個位置找到最後一個零件號子串開始。

下面是一個例子:

select MAX(CAST(SUBSTR(num,INSTR(num,'/')+9,1000) as Int)) 
from T 
where num like TO_CHAR(sysdate,'%/YYYY/MM/%') 

SQLFiddle demo

您也可以排除錯誤格式化從該查詢值,以避免轉換錯誤using the following way

select MAX(CAST(SUBSTR(num,INSTR(num,'/')+9,1000) as Int)) 
from T 
where num like TO_CHAR(sysdate,'%/YYYY/MM/%') 
AND 
LENGTH(TRIM(TRANSLATE(SUBSTR(num,INSTR(num,'/')+9,1000), 
         '', ' '))) is null 

SQLfiddle demo

+0

這看起來不錯。如果我可以,你能詳細介紹一些部分嗎? 'INSTR()+ 9'。所以,tihs是這樣工作的,但我想了解這個部分:'INSTR()+ 9'謝謝。 –

+0

我已將解釋添加到我的答案中。 – valex

+0

謝謝你的解釋。 –

0

試試這個:

SELECT 
    MAX(SUBSTR(num, INSTR(num, '/', 1, 3) + 1)) 
FROM ref 
WHERE 
    SUBSTR(num, INSTR(num, '/', 1, 2) + 1, INSTR(num, '/', 1, 3) - INSTR(num, '/', 1, 2) - 1) = TO_CHAR(sysdate, 'MM') 

樣品:http://sqlfiddle.com/#!4/1b03a/1