如何计算 SQL 中输入字符串的所有分组排列?

Eva*_*oll 6 postgresql query recursive

给定像“ABC”这样的输入,生成一个查询,计算给定字符串的 0 个或多个的所有潜在分割,

期望的输出,

A   B   C
A   BC
AB  C
ABC
Run Code Online (Sandbox Code Playgroud)

给定一个像“ABCD”这样的输入

A    B   C    D
A    BC  D
A    B   CD
AB   C   D
A    BCD
AB   CD
ABC  D
ABCD
Run Code Online (Sandbox Code Playgroud)

并不是所有关心输出如何形成、数组、行、json 等。更多的是寻找分组的所有排列的离散列表。

Lau*_*lbe 9

我想这只是一个有趣的挑战,但这是我的解决方案:

\n
WITH s(s) AS (VALUES ('ABCD'))\nSELECT substr(s, 1, 1) ||\n       string_agg(\n          CASE WHEN i & (2::numeric ^ p)::bigint = 0 THEN '' ELSE ' ' END ||\n          substr(s, p + 2, 1),\n          ''\n       )\nFROM s\n   CROSS JOIN generate_series(0, (2::numeric ^ (length(s) - 1) - 1)::bigint) AS i\n   CROSS JOIN generate_series(0, length(s) - 2) AS p\nGROUP BY s, i;\n\n ?column? \n\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\xe2\x95\x90\n A BC D\n AB C D\n ABCD\n ABC D\n A B CD\n AB CD\n A B C D\n A BCD\n(8 rows)\n
Run Code Online (Sandbox Code Playgroud)\n

这个想法是获取从 0 到 2 ^ (length - 1) - 1 的二进制数,并在有 1 的地方插入空格。因此 101(十进制 5)将变为A BC D

\n