我正在寻找CONNECT BY
的替代方案:
Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
SELECT 'ORACLE' As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);
有什么建议吗?
答案 0 :(得分:4)
有几个选择:
查询1 - 使用集合:
这里的值是硬编码的,所以除非你有一个固定的长度列表,否则这可能不是最好的解决方案。
SELECT SUBSTR( 'ORACLE', 1, COLUMN_VALUE ) AS value
FROM TABLE( SYS.ODCINUMBERLIST( 1, 2, 3, 4, 5, 6 ) )
<强> Results 强>:
| 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' ) ) )
<强> Results 强>:
| 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' ) ) )
<强> Results 强>:
| 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
<强> Results 强>:
| VALUE |
|--------|
| ORACLE |
| ORACL |
| ORAC |
| ORA |
| OR |
| O |
答案 1 :(得分:-2)
选择 RPAD(LPAD('ORACLE',ROWNUM,'ORACLE'),7)AS GRAPH 来自emp 其中rownum&lt; 7
答案 2 :(得分:-2)
这是一个金字塔程序。
选择 RPAD(LPAD(&#39; ILOVEYOU&#39;,ROWNUM,&#39; ILOVEYOU&#39),9) || LPAD(RPAD(&#39; ILOVEYOU&#39;,ROWNUM,&#39; ILOVEYOU&#39),9)LOVEGRAPH 来自EMP 在哪里ROWNUM&lt; 9 UNION ALL SELECT * FROM(SELECT RPAD(LPAD(&#39; ILOVEYOU&#39;,ROWNUM,&#39; ILOVEYOU&#39;),9) || LPAD(RPAD(&#39; ILOVEYOU&#39;,ROWNUM,&#39; ILOVEYOU&#39),9)LOVEGRAPH 来自EMP 在哪里ROWNUM&lt; 9 ORDER BY ROWNUM DESC) /
选择了16行