德哥,你凭什么"七步杀一人"?
背景
昨天佛爷在数据库群里起哄, 怎么用SQL解决24点问题, 当然先问AI, 结果ChatGPT看了都摇头.
挑起了数据库风雅之士的兴趣, 真的是江山代有才人出, 各领风骚数百年.
首先出场的是德哥, 果然是风流倜傥七步杀一人, 1分钟内解决战斗:
使用PG plpython一个函数搞定.
如下, 非常简单.
可以使用我的地表最强PostgreSQL学习镜像来体验.
U-4G77XXWF-1921:~ digoal$ docker run -d -it -P --cap-add=SYS_PTRACE --cap-add SYS_ADMIN --privileged=true --name pg --shm-size=1g registry.cn-hangzhou.aliyuncs.com/digoal/opensource_database:pg14_with_exts_arm64 0af92301ec9d7355155f737336bae23acb12dac43d2f11de4aeeaec201b7323d
U-4G77XXWF-1921:~ digoal$ docker exec -ti pg bash
root@0af92301ec9d:~# psql
psql (14.10 (Debian 14.10-1.pgdg110+1))
Type "help" for help. postgres=# create language plpython3u;
CREATE EXTENSION
postgres=# CREATE OR REPLACE FUNCTION solve_24_game(num1 INTEGER, num2 INTEGER, num3 INTEGER, num4 INTEGER)
RETURNS SETOF TEXT AS $$
import itertools
def solve_24_game(num1, num2, num3, num4):
nums = [num1, num2, num3, num4]
operators = ['+', '-', '*', '/']
perms = itertools.permutations(nums)
for perm in perms:
for ops in itertools.product(operators, repeat=3):
expression = "{0}{4}{1}{5}{2}{6}{3}".format(*perm, *ops)
try:
result = eval(expression)
if result == 24:
yield expression
except ZeroDivisionError:
continue
return
return solve_24_game(num1, num2, num3, num4)
$$ LANGUAGE plpython3u;
CREATE FUNCTION
postgres=# select solve_24_game(1,2,3,4);
solve_24_game
---------------
1*2*3*4
1*2*4*3
1*3*2*4
1*3*4*2
1*4*2*3
1*4*3*2
2*1*3*4
2/1*3*4
2*1*4*3
2/1*4*3
2*3*1*4
2*3/1*4
2*3*4*1
2*3*4/1
2*4*1*3
2*4/1*3
2*4*3*1
2*4*3/1
3*1*2*4
3/1*2*4
3*1*4*2
3/1*4*2
3*2*1*4
3*2/1*4
3*2*4*1
3*2*4/1
3*4*1*2
3*4/1*2
3*4*2*1
3*4*2/1
4*1*2*3
4/1*2*3
4*1*3*2
4/1*3*2
4*2*1*3
4*2/1*3
4*2*3*1
4*2*3/1
4*3*1*2
4*3/1*2
4*3*2*1
4*3*2/1
(42 rows)
postgres=# select solve_24_game(1,6,7,12);
solve_24_game
---------------
6-1+7+12
6-1+12+7
6+7-1+12
6+7+12-1
6+12-1+7
6+12+7-1
7-1+6+12
7-1+12+6
7+6-1+12
7+6+12-1
7+12-1+6
7+12+6-1
12-1+6+7
12-1+7+6
12+6-1+7
12+6+7-1
12+7-1+6
12+7+6-1
(18 rows)
后面又有拿Oracle SQL来战的林春老师, 以及那CTE语法来战的陈刚老师, 可距离德哥给出plpython函数已经半小时过去了, 好了游戏结束.
总结下来, 用SQL太耗费脑细胞, ChatGPT都被直接劝退, 写出来的SQL连GPT都看不懂, 你指望开发者和两位老师有一样的高度, 未来要调整逻辑改写SQL, 这两位老师可能已经是CTO了, 还会在一线? 所以实际场景SQL还是越简单越好, 好维护, 好找人.
生产力工具要我说还得靠编程语言, 所以非常推荐PostgreSQL|PolarDB这类支持高级编程语言函数的数据库, 要不怎么能成就德哥的七步杀一人呢?
欢迎关注我的github (https://github.com/digoal/blog) , 学习数据库不迷路.
近期正在写公开课材料, 未来将通过视频号推出.