2013-12-09 77 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