我对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个子句时,宏使查询变得更清晰和更可维护。
答案 0 :(得分:-1)
您正在描述动态sql。 SQL引擎不会将变量解释为可执行代码。 关于如何按字符串构造查询字符串的文章很多。