Postgres是否存在单复数转换扩展?无需维护转换表
Postgres 实现单复数词汇转换的可用扩展
官方Postgres核心没有内置专门的单复数转换扩展,但有几种现成方案可以替代自己维护词汇表:
- 自定义规则函数(结合基础Postgres功能)
不需要额外安装扩展,直接写PL/pgSQL函数覆盖英文常见单复数规则,比如:
CREATE OR REPLACE FUNCTION pluralize(text) RETURNS text AS $$ BEGIN -- 处理以非元音+y结尾的词(如baby→babies) IF lower($1) LIKE '%y' AND lower($1) NOT LIKE '%[aeiou]y' THEN RETURN substr($1, 1, length($1)-1) || 'ies'; -- 处理s/x/z/ch/sh结尾的词(如box→boxes) ELSIF lower($1) LIKE '%s' OR lower($1) LIKE '%x' OR lower($1) LIKE '%z' OR lower($1) LIKE '%ch' OR lower($1) LIKE '%sh' THEN RETURN $1 || 'es'; -- 处理f/fe结尾的词(如wolf→wolves) ELSIF lower($1) LIKE '%f' THEN RETURN substr($1, 1, length($1)-1) || 'ves'; ELSIF lower($1) LIKE '%fe' THEN RETURN substr($1, 1, length($1)-2) || 'ves'; -- 其他情况直接加s ELSE RETURN $1 || 's'; END IF; END; $$ LANGUAGE plpgsql IMMUTABLE;
这个函数能处理大部分常规单复数转换,适合基础场景,不用依赖外部扩展。
pg_inflector 扩展
你之前提到找不到可用版本,但社区确实有维护这个扩展——它基于Ruby的Inflector库,支持不规则词汇转换(比如child→children、foot→feet这类特殊情况)。需要通过源码编译安装,安装后就能直接调用pluralize()和singularize()函数,处理复杂场景更省心。全文检索词干处理(tsvector)
如果你的需求和全文检索相关,Postgres的tsvector功能自带词干提取,但这不是严格的单复数转换,只是把词汇还原到词干形式(比如running→run),适合检索场景,不适合精确的词汇单复数转换。
总结:如果不想折腾第三方扩展,自定义规则函数是最快的方案;要是需要处理大量不规则词汇,pg_inflector更合适。
内容的提问来源于stack exchange,提问作者Matthys
相关产品推荐
相关产品推荐

