Range Fill Table

若如初见. 提交于 2020-01-06 08:10:31

问题


Good day! There is a table:

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

At the initial stage, we filled in two fields: start_range and end_range.

start_range = a1;
end_range = a5;

Can you fill a completely different table in the range a1-a5 (a1, a2, a3, a4, a5) in Apex?


回答1:


You can use the following:

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;

I am assuming that your start and end range have same prefix with format(string||number)

db<>fiddle demo

Cheers!!




回答2:


Looks like a hierarchical query.

Test case:

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

Query:

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.

Result:

SQL> SELECT * FROM test2 ORDER BY val;

VAL
----------
a1
a2
a3
a4
a5
L4819201
L4819202
L4819203
L4819204
L4819205

10 rows selected.

SQL>


来源:https://stackoverflow.com/questions/57726099/range-fill-table

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!