REGEXP_LIKE 在 PostgreSQL 中

REGEXP_LIKE in Postgresql

我有一个table来存储替换,它包括两个字段,第一个是存储单词,第二个是存储替换。我知道 table 的创建不是 suitable 方法,但它已经存在并被其他系统使用。

table 如下所示:

WORD        SUBS_LIST
------------------------------------
MOUNTAIN    MOUNTAIN, MOUNT, MT, MTN
VIEW        VIEW, VU
FIFTH       V, 5TH
YOU         EWE, U , YEW
ROW         ROW , ROE
ONE         UN , ONE

然后,当一个名字进来时,它是根据table替换的。我能够使用 regexp_like 在 Oracle 上进行先前的操作。但是,我想在 Postgresql 中应用相同的方法。我曾尝试使用 ~ 替换 regexp_like 和 regexp_matches 但没有成功。

请找到here我目前试过的数据库<>Fiddle。

感谢您的帮助:)

你不需要正则表达式。如果我对您的理解正确,您想要输入一个词,请在 sub_list 和 return 的 word 列中搜索元素。最好将(丑陋的)逗号分隔列表转换为数组,然后使用 ANY 运算符:

select word
from the_table
where 'mount' = any(string_to_array(subs_list, ','));

上面的内容可以正确处理 , 周围的空格 - 不确定这是格式设置的结果还是您确实以这种方式存储列表。如果确实需要处理空格,可以使用以下方法:

select word
from the_table
where exists (select *
              from unnest(string_to_array(subs_list, ',')) as x(subs)  
              where trim(x.subs) = 'mount');

如果您输入的是单词列表,您可以使用 regexp_split_to_table() 将输入的单词转换为行并加入替换。

SELECT w.input, coalesce(x.word, w.input) as word
FROM regexp_split_to_table('MOUNT VU FOOD CAFE', '\s') as w(input) 
  LEFT JOIN (
    select s.word, trim(s1.token) as token
    from subs s
      cross join unnest(string_to_array(s.subs_list, ',')) s1(token)
  ) as x on lower(trim(w.input)) = lower(x.token)
;

在线示例:https://rextester.com/DZBF77100