の代替を探していますCONNECT BY
:
Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
SELECT 'ORACLE' As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);
助言がありますか?
の代替を探していますCONNECT BY
:
Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
SELECT 'ORACLE' As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);
助言がありますか?
いくつかのオプション:
クエリ 1 - コレクションを使用します。
ここでは値がハードコーディングされているため、固定長のリストがない限り、これはおそらく最善の解決策ではありません。
SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM TABLE( SYS.ODCINUMBERLIST( 1, 2, 3, 4, 5, 6 ) )
結果:
| VALUE |
|--------|
| O |
| OR |
| ORA |
| ORAC |
| ORACL |
| ORACLE |
クエリ 2 - パイプライン関数を使用してコレクションを生成します。
CREATE OR REPLACE FUNCTION get_numbers (
maximum IN NUMBER
) RETURN SYS.ODCINUMBERLIST PIPELINED AS
BEGIN
FOR i IN 1 .. maximum LOOP
PIPE ROW(i);
END LOOP;
RETURN;
END;
/
SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM TABLE( get_numbers( LENGTH( 'ORACLE' ) ) )
結果:
| VALUE |
|--------|
| O |
| OR |
| ORA |
| ORAC |
| ORACL |
| ORACLE |
クエリ 3 - パイプライン化されていない関数を使用してコレクションを生成する:
CREATE OR REPLACE FUNCTION get_numbers2 (
maximum IN NUMBER
) RETURN SYS.ODCINUMBERLIST
AS
v_nums SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST();
BEGIN
v_nums.EXTEND( maximum );
FOR i IN 1 .. maximum LOOP
v_nums(i) := i;
END LOOP;
RETURN v_nums;
END;
/
SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM TABLE( get_numbers2( LENGTH( 'ORACLE' ) ) )
結果:
| VALUE |
|--------|
| O |
| OR |
| ORA |
| ORAC |
| ORACL |
| ORACLE |
クエリ 4 - 再帰サブクエリ ファクタリングを使用します。
WITH data ( value ) AS (
SELECT 'ORACLE' FROM DUAL
UNION ALL
SELECT SUBSTR( value, 1, LENGTH( value ) - 1 )
FROM data
WHERE LENGTH( value ) > 1
)
SELECT * FROM data
結果:
| VALUE |
|--------|
| ORACLE |
| ORACL |
| ORAC |
| ORA |
| OR |
| O |
これがピラミッドプログラムです。
SELECT RPAD(LPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9) ||LPAD(RPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9)LOVEGRAPH FROM EMP WHERE ROWNUM<9 UNION ALL SELECT * FROM( SELECT RPAD(LPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9) ||LPAD(RPAD('ILOVEYOU',ROWNUM,'ILOVEYOU'),9)LOVEGRAPH FROM EMP WHERE ROWNUM<9 ORDER BY ROWNUM DESC) /
II IL IL ILO ILO ILOVE ILOVE ILOVE ILOVEY ILOVEY ILOVEYO ILOVEYO ILOVEYOU ILOVEYOU ILOVEYOU ILOVEYOU ILOVEYO ILOVEY ILOVEY ILOVE ILOVE ILOV ILOV ILO ILO IL IL II
16 行が選択されました
SELECT RPAD(LPAD('ORACLE',ROWNUM,'ORACLE'),7) AS GRAPH from emp where rownum <7