我正在尝试生成 Strings 列表的所有组合
list = ['A', 'B', 'C', 'D']
。
我想生成所有可能性,然后在数据库中搜索
ABCD, ABC, ABD, ACD, BCD, AB, AC, AD, BC, BD, CD, A, B, C, D
我的专栏是这样的:
结果 | 代码 |
---|---|
1 | 一个 |
2 | 公元前 |
3 | 交流电 |
4 | 乙 |
5 | 美国广播公司 |
6 | 广告 |
7 | BCD |
8 | 光盘 |
9 | A B C D |
10 | ABD |
………… | …… |
澄清一下:顺序无关紧要(ABC = BAC = CAB),它应该返回多个结果(对于 list = ['A', 'B', 'C'] 与上面的 10 列相同,它应该返回 [1 , 2, 3, 4, 5])。
我正在使用 Postgres,我尝试过一些我见过的递归函数,但没有一个能完全满足我的需求。
所以我不确定你为什么要这样做,但我假设你已经用尽了所有其他选择。
TLDR,他可以做你想做的事:https ://dbfiddle.uk/?rdbms=postgres_13&fiddle=27cdc7ef6eaf179936d4d048276b139b
解释
为此,我们需要三件事:
排序规则很重要,因为如果我们说 AB = BA,那么在数据库中进行比较并不容易,尤其是随着长度的增加。但是,我们可以对数据库中的字符串进行排序,并强制要求位置 n 的字符必须小于位置 n+1 的字符。这使得字符串 BA 成为无效的构造。
我们需要递归,因为我们必须从元素的先前连接构建字符串。这可以通过使用递归 CTE在 Postgres 中实现。
从逻辑上讲,该过程是这样工作的:
这是自终止的,因为一旦字符串的长度等于元素的数量,就没有元素大于最后一个元素。
代码
首先,需要一个元素表:
接下来,填充该表:
最后,递归查询以构建所需的输出:
如果元素可以重复(AA、AAA、BB 等)
https://dbfiddle.uk/?rdbms=postgres_13&fiddle=f4b1822f65334ae45109680d3afc0c7f
在这里,我们可以将 or 条件更改为 >=,但是我们需要根据元素的数量来终止递归。
您不需要递归,您可以计算所有可能的字符串组合的矩阵。
我发现这更直接: