分裂字符串的最大部分

时间:2013-12-09 10:15:08

标签: sql oracle10g

在我的DB oracle 10g中,我有一个包含引用的字段。

它存储为:name / yyyy / mm / number

新号码是零件中找到的最大数量mm / number。

所以,现在,我有一个字符串的分割,它给了我一个str_array列表:

str_array(name,yyyy,mm,number)

我想,通过这个,发现最大数量,这对夫妇毫米/数字。

这可以吗?

我可以拥有类似的内容:

  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 ......

Jones / 2013部分对这个数字并不重要。但一个月我不能拥有相同的号码。

道歉,我不知道这是否可行,所以我试着在查询中写下我想要的内容。

这可能,或者我应该在表格中创建多个字段(name/yyyymmnumber)?

编辑: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/%')

这发现了炭的出现。

在其他情况下,这是一个有用的解决方案。

2 个答案:

答案 0 :(得分:1)

要获得最大值,您应该将最后一部分转换为INT值,否则您将因为使用STRING比较规则而得到不正确的结果。 一旦/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),
                      ' 0123456789', ' '))) is null

SQLfiddle demo

答案 1 :(得分: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