postgres 数据库中有两个表。English_all 和 english_glob
第一个表包含国际、机密、启动、冷却器等词
我已经编写了从english_all 中获取单词的函数,然后为每个单词执行for 循环以获取未插入到anglish_glob 表中的单词列表。单词列表就像
I
In
Int
Inte
Inter
..
b
bo
boo
boot
..
c
co
coo
cool
etc..
出于某种原因,zwnj(零宽度非连接器)在插入到english_all 表期间被添加。但在函数中,我正在使用 regexp_replace 删除该字符。
Postgres 函数 for_loop_test 基于我从english_all 表中选择单词而采用两个参数min 和max。
功能代码就像
DECLARE
inMinLength ALIAS FOR $1;
inMaxLength ALIAS FOR $2;
mviews RECORD;
outenglishListRow english_word_list;--custom data type eng_id,english_text
BEGIN
FOR mviews IN SELECT id,english_all_text FROM english_all where wlength between inMinLength and inMaxLength
ORDER BY english_all_text limit 30 LOOP
FOR i IN 1..char_length(regexp_replace(mviews.english_all_text,'()$','')) LOOP
FOR outenglishListRow IN
SELECT distinct on (regexp_replace((substring(mviews.english_all_text from 1 for i)),'()$','')) mviews.id,
regexp_replace((substring(mviews.english_all_text from 1 for i)),'()$','') where
regexp_replace((substring(mviews.english_all_text from 1 for i)),'()$','') not
in(select english_glob.english_text from english_glob where i=english_glob.wlength)
order by regexp_replace((substring(mviews.english_all_text from 1 for i)),'()$','')
LOOP
RETURN NEXT outenglishListRow;
END LOOP;
END LOOP;
END LOOP;
END;
一旦我得到单词列表,我会将其插入另一个表english_glob。我的问题是我可以在函数中添加或删除任何东西以使其更高效。
编辑 让我们假设english_all 表有类似的词
- 页脚,解决,问题,溢出,数据库,王国
如果 inMinLength = 5 且 inmaxLength=7 则在外循环中
- 页脚,解决,王国
将被选中。对于以上 3 个单词,内部两个循环将适用于获取类似的单词
- f,fo,foo,foot,foote,footer,s,se,set,sett,settl ....等。
在最后的过程中,粗体字将被输入到 english_glob 中,并带有另一个参数,如 1 以表示它是一个正确的词,并存储在english_glob 表的另一个字段中。剩余的单词将与另一个参数 0 一起存储,因为在下一次调用中不应再次获取保存在数据库中的单词。
edit2:这是一个完整的代码
CREATE TABLE english_all
(
id serial NOT NULL,
english_all_text text NOT NULL,
wlength integer NOT NULL,
CONSTRAINT english_all PRIMARY KEY (id),
CONSTRAINT english_all_kan_text_uq_id UNIQUE (english_all_text)
)
CREATE TABLE english_glob
(
id serial NOT NULL,
english_text text NOT NULL,
is_prop integer default 1,
CONSTRAINT english_glob PRIMARY KEY (id),
CONSTRAINT english_glob_kan_text_uq_id UNIQUE (english_text)
)
insert into english_all(english_all_text,wlength) values ('ant',char_length('ant')),('forget',char_length('forget')),('forgive',char_length('forgive'));
在使用参数 3 和 6 闲置行的函数调用中应该获取
a
an
ant
f
fo
for
forg
forge
forget
接下来是根据上面的行插入另一个表
insert into english_glob(english_text,is_prop)
values
('a',1),('an',1),
('ant',1),('f',0),
('fo',0),('for',1),
('forg',0),('forge',1),
('forget',1),
下次函数调用时,应获取参数 3 和 7 闲置行。(因为 f、fo、for、forg 都输入到english_glob 表中)
forgi
forgiv
forgive