Sql 分割字符串一部分的最大值

Sql 分割字符串一部分的最大值,sql,oracle10g,Sql,Oracle10g,在我的DB oracle 10g中,有一个包含引用的字段 它存储为:name/yyyy/mm/number 新编号是零件中的最大编号mm/编号 现在,我对字符串进行了拆分,得到了str_数组的列表,如下所示: str_数组(名称、yyyy、mm、编号) 我想,用这个,找到最大数,对于这对mm/数 这有可能做到吗 能给我一些类似于: SELECT MAX(split(reference, '/').lastPartOfArray) into nb FROM table wher

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

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

新编号是零件中的最大编号mm/编号

现在,我对字符串进行了拆分,得到了str_数组的列表,如下所示:

str_数组(名称、yyyy、mm、编号)

我想,用这个,找到最大数,对于这对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/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/%')
这发现了n个字符的出现

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

尝试以下方法:

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')
示例:

尝试以下操作:

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')

示例:

若要获得最大值,应将最后一部分转换为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/%')

您还可以从此查询中排除格式错误的值,以避免转换错误:


若要获得最大值,应将最后一部分转换为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/%')

您还可以从此查询中排除格式错误的值,以避免转换错误:



你能发布一个样本数据和期望的结果吗?尽管这在某种程度上是可能的,但你真的应该在表中拆分你的值。也就是说,为每个值创建一列@JorgeCampos:添加一些数据样本。太好了。您想要给定月份的最大值(已经有答案)还是想要几个月的最大值?一个月内最多12-6/11-7天。但是,它始终是WHERE子句中的实际月份。如果我们在11月,nb将是7,12月,它将是6。你能发布一个样本数据和期望的结果吗?尽管这在某种程度上很可能是可能的,但你真的应该在表中拆分你的值。也就是说,为每个值创建一列@JorgeCampos:添加一些数据样本。太好了。您想要给定月份的最大值(已经有答案)还是想要几个月的最大值?一个月内最多12-6/11-7天。但是,它始终是WHERE子句中的实际月份。如果我们在11月,nb将是7,12月,它将是6。这看起来不错。如果可以的话,你能详细说明一些部分吗<代码>指令()+9。因此,tihs是这样工作的,但我想了解这一部分:
INSTR()+9
谢谢。我已经在我的答案中添加了解释。谢谢你的解释。只是为了确认:如果我的参考格式发生了变化,并且其中一部分是可变的(2,3或4个字符)。这个代码不能正常工作?在这里,我们将看到第一个
/
。我们能不能抓住最后一个(或者可能是发生的n),让查询更安全?找到了一种使用INSTR文档的方法。添加一些编辑我的问题,为那些谁会搜索这个。这看起来不错。如果可以的话,你能详细说明一些部分吗<代码>指令()+9。因此,tihs是这样工作的,但我想了解这一部分:
INSTR()+9
谢谢。我已经在我的答案中添加了解释。谢谢你的解释。只是为了确认:如果我的参考格式发生了变化,并且其中一部分是可变的(2,3或4个字符)。这个代码不能正常工作?在这里,我们将看到第一个
/
。我们能不能抓住最后一个(或者可能是发生的n),让查询更安全?找到了一种使用INSTR文档的方法。添加一些编辑在我的问题,为那些谁会搜索这个。