在oracle中生成一定长度的所有可能的字符串组合

时间:2015-11-06 10:59:55

标签: sql oracle recursion plsql

我编写了一个程序来生成长度为2的字符串的所有可能组合。该计划如下:

CREATE OR REPLACE PROCEDURE string_combinations
AS
  vblString1   VARCHAR2(100);
  vblString2   VARCHAR2(100);
  vblChr1      NUMBER;
  vblChr2      NUMBER;
BEGIN
  vblChr1 := 65;
  LOOP
    SELECT Chr(vblChr1) INTO vblString1 FROM dual;
    vblChr2 := 65;
    LOOP
      vblString2 := vblString1||Chr(vblChr2);
      Dbms_Output.put_line(vblString2);
      vblChr2:=vblChr2+1;
      EXIT WHEN vblChr2=91;
    END LOOP;
  vblChr1:=vblChr1+1;
  EXIT WHEN vblChr1=91;
  END LOOP;
END;
/

我在另一个循环中使用了一个循环。所以,如果我必须生成长度为3的字符串,我可以简单地使用另一个循环。但如果我希望生成长度为5,6,7或更长的字符串,那将会很长。我如何使用递归来实现它? 我正在使用oracle。

2 个答案:

答案 0 :(得分:2)

您不需要 PL / SQL 来生成按字母顺序排列的序列。您可以使用行生成器方法在纯 SQL 中执行此操作。

WITH combinations AS
  (SELECT chr( ascii('A')+level-1 ) c FROM dual CONNECT BY level <= 26
  )
SELECT * FROM combinations
UNION ALL
SELECT c1.c || c2.c FROM combinations c1, combinations c2
UNION ALL
SELECT c1.c
  || c2.c
  || c3.c
FROM combinations c1,
  combinations c2,
  combinations c3
/

上述内容可为您提供所有可能的组合c1c2c3,用于单个和两个字符。要获得更多组合,您只需添加c4c5等组合

即可

答案 1 :(得分:0)

为什么不呢?

SELECT * FROM a1;

       ID NAME
---------- ----------
         1 a
         2 b
         3 c
         4 d
         5 e

选择了5行。

SELECT a.id,b.name
  FROM (SELECT id FROM a1) a, (SELECT name FROM a1) b
 ORDER BY a.id, b.name;

       ID NAME
---------- ----------
         1 a
         1 b
         1 c
         1 d
         1 e
         2 a
         2 b
         2 c
         2 d
         2 e
         3 a
         3 b
         3 c
         3 d
         3 e
         4 a
         4 b
         4 c
         4 d
         4 e
         5 a
         5 b
         5 c
         5 d
         5 e

选择了25行。