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_ARRAY
和 UNNEST
,至少据我所知),将实际的 SQL 片段传递给 PyPika 会解决问题。
谢谢!
不确定它是否适用,但一定要检查 CASE 语句是否可以帮助您。
除此之外,您可以子 class PyPika 的函数 class 并覆盖 get_sql
并使用它,或者(ab)使用 CustomFunction
和 PseudoColumn
实用程序 class 是这样的:
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。
注意:我无法对此进行测试。
如何在 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_ARRAY
和 UNNEST
,至少据我所知),将实际的 SQL 片段传递给 PyPika 会解决问题。
谢谢!
不确定它是否适用,但一定要检查 CASE 语句是否可以帮助您。
除此之外,您可以子 class PyPika 的函数 class 并覆盖 get_sql
并使用它,或者(ab)使用 CustomFunction
和 PseudoColumn
实用程序 class 是这样的:
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。
注意:我无法对此进行测试。