簡體   English   中英

PyPika如何生成IF語句

[英]PyPika how to generate IF statement

如何在 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 可以解決問題。

謝謝!

不確定它是否適用,但請務必檢查 CASE 語句是否可以幫助您。

除此之外,您可以繼承 PyPika 的 Function class 並覆蓋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 上開票。

注意:我無法對此進行測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM