首页 > 解决方案 > 类似于 Postgresql 中的正则表达式

问题描述

在 Postgresql 数据库中,我有一个名为 names 的列,其中有一些需要使用正则表达式解析的名称以清理标点符号部分。我可以使用 regexp_replace 获得一个干净的名称,如下所示:

select regexp_replace(name,'\.COM|''[A-Z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)','','g') 
from tableA  

但是,我想与一些也清除了标点符号的字符串进行比较。我如何使用与形成的正则表达式类似?

select name
from tableA 
where (lower(name) ~ '\.COM|''[A-Za-z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)') as nameParsed similar to '(fg )%' and 
      (lower(name) ~ '\.COM|''[A-Za-z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)') as nameParsed similar to '%( cargo| carrier| cartage )%'

在前面的查询中,我收到了这个错误:

LINE 3: ...-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)') as namePar...

我已经尝试过这样的 where 子句,它似乎正在工作:

select name
from tableA 
where (select lower(regexp_replace(name,'\.COM|''[A-Z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)','','g'))) similar to '(fg )%'

这是最好的方法吗?执行时间达到 46 秒 :(

提前致谢

标签: sqlregexpostgresql

解决方案


您试图在 WHERE 子句中获取列名(是比较,而不是列)。因此,您可以按如下方式使用:

SELECT name 
  FROM "tableA"
 WHERE (regexp_replace(name,'\.COM|''[A-Z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)','','g') similar to '(fg )%' 
    OR regexp_replace(name,'\.COM|''[A-Z]|[^a-zA-Z0-9 -]+|\s(?=&)|(?<!\w\w)(?:\s+|-)(?!\w\w)','','g') similar to '%( cargo| carrier| cartage )%');

或者,如果要查找特定单词,您可以使用ilike而不是。similar to


推荐阅读