SQL是否有宏? (尤其是Presto风格的SQL)

时间:2018-11-30 16:56:43

标签: sql presto

我对SQL比较陌生,我发现自己在SQL中很想要宏。

考虑:

SELECT
  session_id,
  user_id,
  hitnumber,
  IF(
    eventinfo.eventcategory = 'search' AND eventinfo.eventaction = 'RunSearch',
    TRUE, FALSE
  ) issued_search,
FROM google_analytics.hits
JOIN (
  SELECT
    session_id
  FROM google_analytics.hits
  WHERE eventinfo.eventcategory = 'search' AND eventinfo.eventaction = 'RunSearch'
  GROUP BY session_id
) sessions_with_search ON hits.session_id = sessions_with_search.session_id

请注意,eventinfo.eventcategory = 'search' AND eventinfo.eventaction = 'RunSearch'在查询中重复了两次。此子句表示作为搜索行的行。很快,我将要扩展搜索行的概念,以包括很长的类似于OR'ed子句的列表。我不想在2个地方重复这个步骤。而且,我认为在2个地方重复相同的SQL是一个很好的bug来源-我可能会改变一个地方而不考虑另一个地方。

想要一个宏的概念,但据我所知,这些不存在。我希望能够在查询上方指定

SEARCH_HIT=`eventinfo.eventcategory = 'search' AND eventinfo.eventaction = 'RunSearch'`

然后上面的查询将变为:

SELECT
  session_id,
  user_id,
  hitnumber,
  IF(@SEARCH_HIT, TRUE, FALSE) issued_search,
FROM google_analytics.hits
JOIN (
  SELECT
    session_id
  FROM google_analytics.hits
  WHERE @SEARCH_HIT
  GROUP BY session_id
) sessions_with_search ON hits.session_id = sessions_with_search.session_id

查询已经更干净了,但是可以想象当@SEARCH_HIT长20个子句时,宏使查询变得更清晰和更可维护。

问题

  1. 任何IDE中都存在SQL宏吗?
  2. SQL宏是否存在任何SQL语言?
  3. 在任何Presto SQL中是否特别存在SQL宏?
  4. 如果宏不存在,那为什么不呢?为了查询的可维护性,我们用它们替换什么?

1 个答案:

答案 0 :(得分:-1)

您正在描述动态sql。 SQL引擎不会将变量解释为可执行代码。 关于如何按字符串构造查询字符串的文章很多。