我对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'
在查询中重复了两次。此子句表示属于搜索行的行。不久,我将扩展搜索行的概念,以包括一个非常长的或‘ed子句列表,这些子句如下所示。我不想在两个地方重复。此外,我认为在两个地方重复相同的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个子句时,宏的查询更加清晰和可维护。
问题
发布于 2018-11-30 09:28:09
您正在描述动态sql。SQL引擎不将变量解释为可执行代码。有很多关于如何逐字符串构造查询字符串的文章。
https://stackoverflow.com/questions/53561809
复制