【问题标题】:Does SQL have macros? (especially Presto-flavored SQL)SQL有宏吗? (尤其是 Presto 风格的 SQL)
【发布时间】:2018-12-01 01:35:28
【问题描述】:

我对 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 子句列表,看起来像这样。我不想在 2 个地方重复这一点。此外,我认为在 2 个地方重复相同的 SQL 是一个很好的错误来源——我可能会不假思索地改变一个地方而不是另一个地方。

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

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. SQL 宏是否存在于任何 Presto SQL 中?
  4. 如果宏不存在,那为什么不呢?为了查询的可维护性,我们用什么替换它们?

【问题讨论】:

  • 通常有两种方法可以做到这一点:用户定义的函数和包含要匹配的字段的表。第一个将封装逻辑,第二个将意味着按照您正在查看的标准加入一次。任一选项都消除了对文字值的多重检查。功能可能是最直接的;传入两个字段并返回一个布尔值。由于我没有使用 Presto,所以没有提供答案
  • @JnBrymn 。 . . SQL 中不存在宏,大概这是某些所见即所得哲学的一部分。 SQL 可以与大多数编程语言结合使用,并且许多语言都有宏。例如,它经常与 Python 一起使用。
  • 您是否查看了 Presto 的 PREPARE 声明 (prestodb.io/docs/current/sql/prepare.html)?

标签: sql presto


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2021-12-17
    • 2020-09-09
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多