postgresql - 我如何将此代码转换为 PostgreSQL 存储过程?
问题描述
我是 PostgreSQL 新手。我想将此代码转换或添加到存储过程。
WITH RECURSIVE t(i) AS (
SELECT * FROM unnest((select regexp_split_to_array('signature',''))::char[])
), cte AS (
SELECT i AS combo, i, 1 AS ct
FROM t
UNION ALL
SELECT cte.combo || t.i, t.i, ct + 1
FROM cte, t
WHERE ct <= 8
AND position(t.i in cte.combo) = 0
)
SELECT distinct cc.combo,ww.word
FROM cte cc
inner join words ww ON ww.word=cc.combo
WHERE length(combo)>1
AND ww.source_id in(1,2,19,21,24,26,33,34)
ORDER BY cc.combo ASC;
解决方案
只需将其放入一个函数中:
create function generate_anagrams(p_word text)
returns table(combo text, word text)
as
$$
WITH RECURSIVE t(i) AS (
SELECT *
FROM unnest((select regexp_split_to_array(p_word,''))::char[])
), cte AS (
SELECT i AS combo, i, 1 AS ct
FROM t
UNION ALL
SELECT cte.combo || t.i, t.i, ct + 1
FROM cte, t
WHERE ct <= 8
AND position(t.i in cte.combo) = 0
)
SELECT distinct cc.combo,ww.word
FROM cte cc
inner join words ww ON ww.word=cc.combo
WHERE length(combo)>1
AND ww.source_id in(1,2,19,21,24,26,33,34)
ORDER BY cc.combo ASC
$$
language sql;
你可以像这样使用它:
select *
from generate_anagrams('signature');
推荐阅读
- r - 如何使用 gganimate 在 R 中为 geom_polygon 设置动画?
- python - 如何以特定的时间间隔连续触发动作?敌人在pygame中发射恒定光束而不是子弹
- excel - 在多列中查找相似值,求和并获取范围
- csv - HERE XYZ 无法通过命令行上传数据文件
- mysql - 如何索引和查询具有 60M 行和 50 列的非常大的数据库
- go - 完全删除使用“go get”安装的软件包?
- javascript - Lozad延迟加载插件,加载前图片显示链接断开
- java - java.lang.ClassCastException:java.math.BigDecimal 不能转换为 java.lang.Long
- botframework - 在虚拟助手模板中使用 Content Moderator 会引发错误
- java - 在 Java 8 中以静态方式获取类名