【问题标题】:PyPika how to generate IF statementPyPika如何生成IF语句
【发布时间】:2020-06-01 14:28:14
【问题描述】:

如何在 PyPika 中生成 IF 语句?

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

IF (date_range.kind = 'year', date_range.name, NULL) as year

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

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

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,以便将它们包含在结果查询字符串中? Pypika 没有生成几个 SQL 片段(例如 GENERATE_DATE_ARRAYUNNEST,至少据我所知),将实际的 SQL 片段传递给 PyPika 可以解决问题。

谢谢!

【问题讨论】:

    标签: pypika


    【解决方案1】:

    不确定它是否适用,但请务必检查 CASE 语句是否可以帮助您。

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

    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 上买票。

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

    【讨论】:

    • 我最终使用了CustomFunction。感谢您的帮助!
    猜你喜欢
    • 2019-08-20
    • 2016-04-05
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2011-10-25
    相关资源
    最近更新 更多