Oracle中是否有“connect by”的替代方法?

时间:2015-10-12 18:00:06

标签: sql oracle connect-by

我正在寻找CONNECT BY的替代方案:

Select SUBSTR(str,1,LEVEL) OUTPUT FROM
(
    SELECT 'ORACLE'  As str FROM DUAL
)
CONNECT BY LEVEL<=LENGTH(str);

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

有几个选择:

SQL Fiddle

查询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) /

LOVEGRAPH

我是 IL IL 国际劳工组织ILO ILOV ILOV ILOVE ILOVE ILOVEY ILOVEY ILOVEYO ILOVEYO 我爱你我爱你 我爱你我爱你 ILOVEYO ILOVEYO ILOVEY ILOVEY ILOVE ILOVE ILOV ILOV 国际劳工组织ILO IL IL 我,我

选择了16行