【问题标题】:In a oracle procedure to get the maximum number from Varchar data type field having a prefix在 oracle 过程中从具有前缀的 Varchar 数据类型字段中获取最大数量
【发布时间】:2021-11-10 05:15:57
【问题描述】:

我有一个名为 ORG 的表,其中有一个名为 ORG_ID 的字段,我需要从 ORG ID 中获取特定前缀的最大值。例如

表组织

ORG_ID ORG_NAME
AB1 Apple
AB2 Google
HQ1 Microsoft
AB3 Tesla
HQ2 Amazon

现在,我想获取与前缀 AB 关联的最大数值,我在下面使用

select max(ORG.ORG_ID)
from ORG
where ORG_ID like 'AB'

它返回AB3我可以使用正则表达式来获取数值3。 我关心的是上面的选择查询是否总是保证序列 AB 的最大数值。

代码

DECLARE
      v_max_number  NUMBER;
       v_max_org_id  VARCHAR2 (20);
       v_max_var     VARCHAR2 (20);
  
       CURSOR curb IS
          SELECT org_id, name
            FROM tableb
          FOR UPDATE;
 
      cbr           curb%ROWTYPE;
      i             NUMBER := 1;
      
   BEGIN
      SELECT MAX (tablea.org_id)
        INTO v_max_org_id
        FROM tablea
       WHERE org_id LIKE 'AB%';
 
      SELECT REGEXP_SUBSTR (v_max_org_id, '\d+') INTO v_max_number FROM DUAL;
 
      SELECT REGEXP_SUBSTR (v_max_org_id, '\D+') INTO v_max_var FROM DUAL;
 
      -- For Loop to write data to Table B
      OPEN curb;
 
      LOOP
         FETCH curb INTO cbr;
 
        EXIT WHEN curb%NOTFOUND;
 
         v_max_org_id := v_max_var || TO_CHAR (v_max_number + i);
 
         UPDATE tableb
            SET org_id = v_max_org_id
          WHERE CURRENT OF curb;
 
         i := i + 1;
      END LOOP;
   END;

【问题讨论】:

  • 此查询不返回AB3,因为ORG_ID like 'AB'ORG_ID = 'AB' 相同。请使用正则表达式显示您的代码
  • 嗨@astentx,我在问题中添加了代码。

标签: sql oracle plsql


【解决方案1】:

你问:

我担心的是上面的选择查询是否总是保证序列 AB 的最大数值。

“上面的查询”是

select max(ORG.ORG_ID)
from ORG
where ORG_ID like 'AB'

那么,它返回 MAX 数值吗?我不这么认为:

SQL> with test (id) as
  2    (select 'AB5'    from dual union all
  3     select 'AB15'   from dual union all
  4     select 'AB1280' from dual             --> 1280 is MAX (compared to 5 and 15)
  5    )
  6  select max(id)
  7  from test
  8  where id like 'AB%'
  9  /

MAX(ID
------
AB5                   --> this is what your query returns

SQL>

根据您发布的这个(和之前的)问题中的示例数据,考虑

SQL> with test (id) as
  2    (select 'AB5'    from dual union all
  3     select 'AB15'   from dual union all
  4     select 'AB1280' from dual
  5    )
  6  select max(to_number(regexp_substr(id, '\d+$'))) result
  7  from test
  8  where id like 'AB%'
  9  /

    RESULT
----------
      1280

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 2019-07-16
    相关资源
    最近更新 更多