首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyPika如何生成IF语句

PyPika如何生成IF语句
EN

Stack Overflow用户
提问于 2020-06-01 22:28:14
回答 1查看 505关注 0票数 0

如何在PyPika中生成IF语句?

我正在尝试生成一个将行旋转到列的BigQuery查询。我发现,如果我在查询中使用以下内容(其中date_range来自WITH语句):

代码语言:javascript
复制
IF (date_range.kind = 'year', date_range.name, NULL) as year

那么这将会起作用。但是,我还没有找到在PyPika中生成这个SQL片段的方法。

为了完整起见,下面是我需要在BigQuery中运行的一个查询示例:

代码语言:javascript
复制
WITH date_range AS (
SELECT
    CAST(EXTRACT(year FROM year) as string) name,
    'year' kind,
    year start_date,
    DATE_ADD(year, INTERVAL 1 year) end_date
FROM UNNEST(GENERATE_DATE_ARRAY('2010-01-01','2020-06-01',INTERVAL 1 year)) year

UNION ALL

SELECT
    FORMAT_DATE('%B', month)||' '||EXTRACT(year FROM month) name,
    'month' kind,
    month start_date,
    DATE_ADD(month,INTERVAL 1 month) end_date
FROM
    UNNEST(GENERATE_DATE_ARRAY('2010-01-01','2020-06-01',INTERVAL 1 month)) month
)
SELECT
IF(date_range.kind='year', date_range.name, null) as year,
IF(date_range.kind='month', date_range.name, null) as month,
SUM(sales.sales_value) sales_value,
FROM sales
JOIN date_range ON sales.start_date>=date_range.start_date AND sales.end_date<date_range.end_date
GROUP BY year, month
ORDER BY year, month

我更普遍的问题是,有没有一种方法可以将文字字符串传递给PyPika,以便将这些字符串包含在生成的查询字符串中?有几个SQL片段是Pypika不会生成的(比如GENERATE_DATE_ARRAYUNNEST,至少我能找到),将实际的SQL片段传递给PyPika就可以解决这个问题。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-02 01:45:11

不确定它是否适用,但一定要检查CASE语句是否对您有帮助。

除此之外,您可以子类化PyPika的Function类并覆盖get_sql并使用它,或者(Ab)使用CustomFunctionPseudoColumn实用程序类,如下所示:

代码语言:javascript
复制
from pypika import CustomFunction

sales_table = Table('sales')
MyIf = CustomFunction('IF', ['condition', 'if', 'else'])
q = Query.from_(sales_table).select(
    MyIf(PseudoColumn("date_range.kind = 'year'"), PseudoColumn("date_range.name"), None, alias="year")
)

然而,我可能会推荐在PyPika Github上订一张票。

注意:我无法对此进行测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62134449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档