【问题标题】:Generate all possible combinations of strings of certain length in oracle在oracle中生成一定长度的字符串的所有可能组合
【发布时间】:2016-02-07 12:16:37
【问题描述】:

我编写了一个程序来生成长度为 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。

【问题讨论】:

    标签: sql oracle recursion plsql


    【解决方案1】:

    您不需要 PL/SQL 来生成字母序列。您可以使用 Row Generator 方法在纯 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 等。

    【讨论】:

    • 多么美妙的解决方案。感谢您的快速回复。节省了很多时间。
    【解决方案2】:

    为什么不这样?

    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 行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2012-08-23
      相关资源
      最近更新 更多