选择列字段中的最大值

问题描述 投票:0回答:1

我创建了一个如下所示的变量来容纳多个 varchar 值。

DECLARE
  TYPE t_refField10 IS TABLE OF VARCHAR2 (25);
  v_refField10 t_refField10;
BEGIN
  SELECT REF_FIELD_10 BULK COLLECT INTO v_refField10 FROM LPN  WHERE 
  TC_ASN_ID = v_asnId;
END;

想要的 ref_field_10 值的最大值。 但问题是: ref_field_10 值是 varchar 类型,它们是这样的。

enter image description here

它们采用 YYYYMMDD-HRS 格式。

此处 20220409-16 表示 2022 年 4 月 9 日下午 4 点。 20220411-09 表示 2022 年 4 月 11 日上午 9 点。

我需要找到 ref_field_10 的最大值(ref_field_10 具有最新的日期时间)。

有人可以帮我吗?

我不知道如何实现这一目标。

oracle sorting stored-procedures
1个回答
0
投票

很多选择。您的字符串格式日期已经按照与实际日期相同的字母顺序排列,因此简单的

MAX
ORDER BY
GREATEST
开箱即用即可正常工作。要获得价值,您可以:

  1. 将集合定义为 SQL 类型,然后直接使用 SQL 查询填充的集合(列名称字面意思是“

    COLUMN_VALUE
    ”):

    create TYPE t_refField10 IS TABLE OF VARCHAR2 (25);
    
    DECLARE
      v_refField10 t_refField10;
      var_maxvalue varchar2(25);
    BEGIN
      SELECT REF_FIELD_10 BULK COLLECT INTO v_refField10 FROM LPN  WHERE 
      TC_ASN_ID = v_asnId;
    
      SELECT MAX(column_value)
        INTO var_maxvalue
        FROM TABLE(v_refField10);
    
      dbms_output.put_line(var_maxvalue);
    END;
    
  2. 从您的集合总体中进行单独的查询以获得最大值

    DECLARE
      TYPE t_refField10 IS TABLE OF VARCHAR2 (25);
      v_refField10 t_refField10;
      var_maxvalue varchar2(25);
    BEGIN
      SELECT REF_FIELD_10 BULK COLLECT INTO v_refField10 FROM LPN  WHERE 
      TC_ASN_ID = v_asnId;
    
      SELECT MAX(REF_FIELD_10) INTO var_maxvalue FROM LPN  WHERE 
      TC_ASN_ID = v_asnId;
    
      dbms_output.put_line(var_maxvalue);
    END;
    
  3. 向集合中添加一个降序

    ORDER BY
    子句,然后获取第一个数组索引:

    DECLARE
      TYPE t_refField10 IS TABLE OF VARCHAR2 (25);
      v_refField10 t_refField10;
      var_maxvalue varchar2(25);
    BEGIN
      SELECT REF_FIELD_10 BULK COLLECT INTO v_refField10 FROM LPN  WHERE 
      TC_ASN_ID = v_asnId ORDER BY REF_FIELD_10 DESC;
    
      var_maxvalue := v_refField10(1); -- or v_refField10(v_refField10.FIRST)
      dbms_output.put_line(var_maxvalue);
    END;
    
  4. 在 PL/SQL 中循环遍历集合:

     DECLARE
       TYPE t_refField10 IS TABLE OF VARCHAR2 (25);
       v_refField10 t_refField10;
       var_maxvalue varchar2(25) := ' ';
     BEGIN
       SELECT REF_FIELD_10 BULK COLLECT INTO v_refField10 FROM LPN  WHERE 
       TC_ASN_ID = v_asnId;
    
       FOR i IN v_refField10.FIRST .. v_refField10.LAST
       LOOP
         var_maxvalue := GREATEST(v_refField10(i),var_maxvalue);
       END LOOP;
    
       dbms_output.put_line(var_maxvalue);
     END;
    
© www.soinside.com 2019 - 2024. All rights reserved.