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

标签 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;
/

我在另一个循环中使用了一个循环。因此,如果我必须生成长度为三的字符串,我可以简单地使用另一个循环。但如果我希望生成长度为 5、6、7 或更长的字符串,那就太长了。我该如何使用递归来实现它? 我正在使用甲骨文。

最佳答案

您不需要 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 等。

关于sql - 在oracle中生成一定长度的字符串的所有可能的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33565292/

相关文章:

用给定的最小值构造斐波那契树的算法

MySQL:表达两个具有公共(public)基表外键的表的完全联接

mysql - 在数据库中找不到表

oracle - 为什么 PostgreSQL 允许没有 order by expression 的 frame 子句?

sql - 我试图理解这串代码及其含义,具体说明 '[^|]+'

java - java 中的大整数乘法(递归)在输入 2000 位数字量级时停止,不会出现错误。为什么?

java - 捕获异常时不定式递归

mysql - 从 JIRA 数据库中提取冲刺开始和结束日期的最简单方法是什么?

MySQL 将行转换为动态列数

无法针对 OCILIB 进行编译