是否可以使用PostgreSQL将标志传递给regex_matches?

时间:2015-12-01 15:02:49

标签: postgresql jooq

我正在尝试从一个字段中选择多个匹配项,我将查询作为SQL运行但是在jOOQ版本时却不知所措。这是SQL:

SELECT
  array_to_string(array(select array_to_string(regexp_matches(m.content, '#([a-zA-Z0-9]+)', 'g'), ' ')), ' ') hashtags
FROM tweets

但我无法弄清楚如何将'g'标记传递给regexp_matches,而Postgres不支持g:样式嵌入标记。目前我正在使用(在Scala中):

val hashtags = DSL.field(
  "array_to_string(array(select array_to_string(regexp_matches(tweets.content, '#([a-zA-Z0-9]+)', 'g'), ' ')), ' ')",
  classOf[String])

但这看起来有点严重(但它确实有效,所以就是这样!)。

当前方法

我有一个包含相关字段的枚举,如下所示:

MentionUri(MENTIONS.URL),
Content(MENTIONS.CONTENT),
Hashtags(DSL.field(
  "array(select array_to_string(regexp_matches(mentions.content, '#([a-zA-Z0-9]+)', 'g'), ' '))").as("hashtags")),
MediaLinks(DSL.field("json_agg(twitter_media)").as("media_links")),
Location(MENTIONS.LOCATION),

需要'g'标志,因为我想从目标文本中获取匹配片段的所有(在这种情况下提及内容的所有主题标签,其中提到的是推文,Facebook帖子,& c。)

和一个包含一堆可选搜索参数的类,如下所示:

minFollowing: Option[Int] = None,
maxFollowing: Option[Int] = None,
workflowStates: Set[WorkflowState] = WorkflowState.values.toSet,
onlyVerifiedUsers: Boolean = false,

然后我根据这些字段的列表构建查询

private val fields = v.fields.toSet
override def query(sql: DSLContext): Query = {
  val fields = v.fields.map(_.field) ++ Seq(M.PROJECT_ID)
  var query = (sql
    select fields.toSet.asJava
    from M
    leftJoin MTM on (M.PROJECT_ID === MTM.PROJECT_ID) and (M.ID === MTM.MENTION_ID)
    leftJoin TM on (MTM.URL === TM.URL)
    where (M.PROJECT_ID in v.criteria.projectIds.asJava))
  if (v.criteria.channels.size < numChannels)
    query = query and (M.CHANNEL in v.criteria.channels.asJava)
  if (v.criteria.mentionTypes.size < numMentionTypes)
    query = query and (M.MENTION_TYPE in v.criteria.mentionTypes.asJava)
  // ... more critera get added here, finally ...
  if (v.max.isDefined)
    query groupBy (M.PROJECT_ID, M.ID, M.CHANNEL, M.USERNAME) limit v.max.get
  else
    query groupBy (M.PROJECT_ID, M.ID, M.CHANNEL, M.USERNAME)

0 个答案:

没有答案