【问题标题】:Range Fill Table范围填充表
【发布时间】:2019-08-30 11:42:25
【问题描述】:

美好的一天! 有一张桌子:

CREATE TABLE table
(
start_range  varcahar2(10),
end_range varcahar2(10),
val_range NUMBER(10)
);

在初始阶段,我们填写了两个字段:start_range 和 end_range。

start_range = a1;
end_range = a5;

您能否在 Apex 中填写 a1-a5 (a1, a2, a3, a4, a5) 范围内的完全不同的表格?

【问题讨论】:

    标签: sql oracle oracle-apex


    【解决方案1】:

    您可以使用以下内容:

    SELECT
        DISTINCT PREFIX || ( START_RANGE + LEVEL - 1 )
    FROM
        (
            SELECT
                REGEXP_SUBSTR(START_RANGE, '^[[:alpha:]]+') AS PREFIX,
                REGEXP_SUBSTR(START_RANGE, '\d+$') AS START_RANGE,
                REGEXP_SUBSTR(END_RANGE, '\d+$') AS END_RANGE
            FROM
                TEST
        )
    CONNECT BY
        LEVEL <= END_RANGE - START_RANGE + 1
    ORDER BY 1;
    

    我假设您的开始和结束范围具有相同的前缀格式(字符串||数字)

    db<>fiddle demo

    干杯!!

    【讨论】:

    • 嗨,如果我有多个条目?它搜索所有范围,我需要特定的
    • 而且可以同时写在两张表里吗??
    • 嗨,我想再次感谢您的帮助并再要求一次,当使用“L00000000”和“L00000010”等极端寒冷时,我得到:L1,L2,L3 ...但是我想看看:L00000000,L00000001,L00000002,...,你能帮我吗??
    【解决方案2】:

    看起来像一个分层查询。

    测试用例:

    SQL> CREATE TABLE test
      2  (
      3     start_range  VARCHAR2 (10),
      4     end_range    VARCHAR2 (10),
      5     val_range    NUMBER (10)
      6  );
    
    Table created.
    
    SQL> INSERT INTO test
      2       VALUES ('a1', 'a5', NULL);
    
    1 row created.
    
    SQL> INSERT INTO TEST
      2       VALUES ('L4819201', 'L4819205', NULL);
    
    1 row created.
    
    SQL> SELECT * FROM test;
    
    START_RANG END_RANGE   VAL_RANGE
    ---------- ---------- ----------
    a1         a5
    L4819201   L4819205
    

    查询:

    SQL> INSERT INTO test2 (val)
      2     SELECT    SUBSTR (start_range, 1, 1)
      3            || TO_CHAR (
      4                  (  TO_NUMBER (REGEXP_SUBSTR (start_range, '\d+$'))
      5                   + COLUMN_VALUE
      6                   - 1))
      7               AS val
      8       FROM test
      9            CROSS JOIN
     10            TABLE (
     11               CAST (
     12                  MULTISET (
     13                         SELECT LEVEL
     14                           FROM DUAL
     15                     CONNECT BY LEVEL <=
     16                                     TO_NUMBER (
     17                                        REGEXP_SUBSTR (end_range, '\d+$'))
     18                                   - TO_NUMBER (
     19                                        REGEXP_SUBSTR (start_range, '\d+$'))
     20                                   + 1) AS SYS.odcinumberlist))
     21      WHERE start_range = '&start_range';
    Enter value for start_range: a1
    
    5 rows created.
    
    SQL> /
    Enter value for start_range: L4819201
    
    5 rows created.
    

    结果:

    SQL> SELECT * FROM test2 ORDER BY val;
    
    VAL
    ----------
    a1
    a2
    a3
    a4
    a5
    L4819201
    L4819202
    L4819203
    L4819204
    L4819205
    
    10 rows selected.
    
    SQL>
    

    【讨论】:

    • 谢谢,但我如何将这个答案写到 table2 ?到 VAL 线
    • 使用 INSERT,Andrii。 insert into your_table (val) select substr(start_range ... 。我已经编辑了我的答案;请看一下。
    • 非常感谢您的帮助,我写 start_range = L4819201; 时的最后一个问题; end_range = L4819205;它不起作用
    • 当然不是。您必须在第 4 行输入 L4819201 而不是 a1
    • 我在那里改过
    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 2016-02-29
    • 2021-09-26
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    相关资源
    最近更新 更多