在我的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/yyyy
,mm
,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 :(得分: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/%')
此外,您可以从此查询中排除错误的格式化值,以避免转换错误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
答案 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')