问题
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