postgresql 如何检查列是否包含子串或多个单词?

mrwjdhj3  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(89)

在Postgresql版本15中,我有两个表,它们可能包含相同的对象。在这两个表(即architecture_permissionsexperts_conclusion)中,我都有名为object_name的列。我的任务如下:
1.检查列值是西里尔文还是拉丁文。如果值是西里尔文,则将其翻译为拉丁文。我使用这样的函数:
CREATE OR REPLACE FUNCTION cyrillic_transliterate(p_string text) RETURNS varying AS $BODY$ SELECT replace(replace(replace(replace(replace(replace(replace(replace(translate(lower($1, 'абвгдеёзийклмнопрстуфхцэы, 'abvgdeezijklmnoprstufхcey'), 'ж','zh'),'ч', 'ch'), 'ш', 'sh'), 'щ', 'shh'), 'ъ', ''), 'ю, 'yu'), 'я', 'ya'), 'ь', ''); $BODY$ LANGUAGE SQL IMMUTABLE COST 100;
1.检查哪些表列具有较长的值,然后检查较长的列是否包含较小的值。例如:
architecture_permissions表中,列object_name具有值:
这是一个很好的例子。
cyrillic_transliterate函数的音译给出了这样的结果:
jizza shahar ittifoq mahallasi loyihadagi ko'chasi judududida joylashgan fuqaro jajitbaev oybek o'ral o'g'liga tegishli non-tegishli bronzona binosini 2-qavatli qilib rekonstruksiya qilish
experts_conclusion表中,列object_name具有值:
哈伊特巴耶夫加·诺沃乔纳西尼·雷孔斯特鲁克西亚·吉利什·乌春
单词可能顺序不同、拼写错误或有后缀或前缀:
ajitbaev -> Xajitbaevga nonkonzona-> nonvoyxonasini rekonstruksiya -> rekonstuksiya
如果有多个单词超过3个匹配较长的列,则将它们连接起来。例如:
jizza shahar ittifoq mahallasi loyihadagi ko'chasi judududida joylashgan fuqaro jajitbaev oybek o'ral o'g'liga tegishli non-tegishli bronzona binosini 2-qavatli qilib rekonstruksiya qilish
包含文字:
农沃伊肖纳、列孔斯特鲁克西亚、吉利什·沙伊特巴耶夫
然后将这两个记录合并。

kninwzqo

kninwzqo1#

您的函数可以被修复/优化:

CREATE OR REPLACE FUNCTION cyrillic_transliterate(p_string text)
  RETURNS text
  LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
$func$
SELECT replace(replace(replace(replace(replace(replace(
               translate(lower($1)
                       , 'абвгдеёзийклмнопрстуфхцэыъь'
                       , 'abvgdeezijklmnoprstufхcey')
             , 'ж', 'zh')
             , 'ч', 'ch')
             , 'ш', 'sh')
             , 'щ', 'shh')
             , 'ю', 'yu')
             , 'я', 'ya');
$func$;

字符串
translate()可以用 nothing 替换字符,如演示所示。
关于PARALLEL SAFE

“剩下的问题现在还很模糊"

相关问题