【发布时间】: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 个子句时,宏使查询变得更加清晰和可维护。
问题
- 任何 IDE 中都存在 SQL 宏吗?
- SQL 宏是否存在于任何 SQL 语言中?
- SQL 宏是否存在于任何 Presto SQL 中?
- 如果宏不存在,那为什么不呢?为了查询的可维护性,我们用什么替换它们?
【问题讨论】:
-
通常有两种方法可以做到这一点:用户定义的函数和包含要匹配的字段的表。第一个将封装逻辑,第二个将意味着按照您正在查看的标准加入一次。任一选项都消除了对文字值的多重检查。功能可能是最直接的;传入两个字段并返回一个布尔值。由于我没有使用 Presto,所以没有提供答案
-
@JnBrymn 。 . . SQL 中不存在宏,大概这是某些所见即所得哲学的一部分。 SQL 可以与大多数编程语言结合使用,并且许多语言都有宏。例如,它经常与 Python 一起使用。
-
您是否查看了 Presto 的
PREPARE声明 (prestodb.io/docs/current/sql/prepare.html)?