SELECT 和 WHERE 中的冗余正则表达式

Posted

技术标签:

【中文标题】SELECT 和 WHERE 中的冗余正则表达式【英文标题】:Redundant regex in SELECT and WHERE 【发布时间】:2014-02-27 14:30:29 【问题描述】:

有没有更好的方法来做到这一点?两次使用相同的正则表达式似乎很愚蠢,但我想指出哪个短语触发了所选的消息内容。服务器上的 Greenplum 4.2.2.4(如 PostgreSQL 8.2)。

SELECT
to_timestamp(extrainfo.startdate/1000)
,messages.timestamp
,users.username
,substring(messages.content from E'(?i)phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future')
,messages.content

FROM users
LEFT JOIN messages ON messages.senderid = users.id
LEFT JOIN extrainfo ON extrainfo.username = users.username

WHERE extrainfo.type1 = 't'
AND messages.content ~* E'phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future'
AND (extrainfo.type2 = 'f' OR extrainfo.type2 IS NULL)

【问题讨论】:

真的是PostgreSQL 8.2(古版)还是你用的是Greenplum或者Redshift? SELECT version() 返回:x86_64-unknown-linux-gnu 上的 PostgreSQL 8.2.15 (Greenplum Database 4.2.2.4 build 1 Community Edition),由 GCC gcc (GCC) 4.4.2 编译2012 年 10 月 17 日 11:52:28 如果你用的是Greenplum,请不要说是PostgreSQL。它不是。这是Greenplum数据库。它与真正的 PostgreSQL 有非常不同的特性和功能。我为你解决了你的问题。 很高兴知道这一点。我不是DBA,所以不知道。谢谢你的信息。 【参考方案1】:

尝试使用基本连接:

SELECT
   to_timestamp(extrainfo.startdate/1000)
   ,messages.timestamp
   ,users.username
   ,substring(messages.content from rgxp.rgxp )
   ,messages.content
FROM users
LEFT JOIN messages ON messages.senderid = users.id
join ( 
  select E'(?i)phrase number one|phrase\.two|another phrase|this list keeps going|lots\.of\*keyword phrases|more will be added in the future'::text
      as rgxp
) rgxp
on messages.content ~* rgxp.rgxp
LEFT JOIN extrainfo ON extrainfo.username = users.username
WHERE extrainfo.type1 = 't'
AND (extrainfo.type2 = 'f' OR extrainfo.type2 IS NULL)

这是一个演示(仅限一张桌子):http://sqlfiddle.com/#!11/4a00d/2

【讨论】:

感谢您的建议。它似乎在某种程度上起作用,但没有完全填充子字符串列(大多数条目返回为 null)。 没关系,我在代码中有错字。已更正并立即工作!非常感谢:)

以上是关于SELECT 和 WHERE 中的冗余正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

使 SQL Server 中的正则表达式搜索更高效

在在线正则表达式测试器中工作的 MariaDB 正则表达式在 SELECT WHERE REGEXP 中不起作用

如何消除正则表达式中的冗余?

lambda表达式中的Select和Where的区别?

SQL中的正则表达式来检测一个或多个数字

mysql 正则表达式查询