sql - 类似于 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 秒 :(
提前致谢
解决方案
您试图在 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
推荐阅读
- web - 如何在 Julia 中播放有声读物 .m4b 文件?
- javascript - TypeError: dom.getElementsByTagName is not a function Node.js
- c - 用 C 语言制作数字时钟
- stored-procedures - 如何在雪花中调用存储过程
- javascript - 编译时反应js核心UI构建错误
- pywinauto - PyWinAuto:释放对话框打开过程,以便您可以用它做事
- r - 如何按特定值添加行
- javascript - 我使用 javascript/jquery 允许弹出我网站上的图像,但它似乎不起作用
- python - 将 Django 数据库 pk id 传递给 Dash 应用程序
- heroku - socket.io 中的原点在部署时是否更改?