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 等。更多的是寻找分组的所有排列的离散列表。
我想这只是一个有趣的挑战,但这是我的解决方案:
\nWITH 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
。
归档时间: |
|
查看次数: |
1292 次 |
最近记录: |