类似于Postgresql中的正则表达式

时间:2019-12-10 18:01:55

标签: sql regex postgresql

在Postgresql数据库中,我有一列称为名称,其中有一些名称需要使用正则表达式进行解析以清理标点符号。我可以使用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秒:(

预先感谢

1 个答案:

答案 0 :(得分:1)

您试图在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