【问题标题】:sql: select list of columnssql:选择列列表
【发布时间】:2022-01-22 17:25:25
【问题描述】:

我想传递一个 str 或 list 参数,并希望 sql 知道如何处理它。 list_col='date1, date2, date3, date4' 的示例,最后我想要数据框 日期1,日期2,日期3,身份证

query = """
    SELECT {list_col} AT TIME ZONE 'Europe/Paris' as {list_col}, {table}.{id}
    FROM {table} 
    ORDER BY {table}.{id}
"""

def fun_query(table_name, list_col, id):
    return query.format(table=table_name, list_col=list_col, id=id)

请问有人知道怎么做吗?

【问题讨论】:

  • 那么到底是什么问题?
  • 如何在 {list_col} 中传递一个列表
  • 没有简单的方法可以做到这一点。 AT TIME ZONE 子句应与每一列一起出现,否则它不应该是模板中的硬编码字符串。
  • @TimBiegeleisen 是的,你知道该怎么做吗?
  • 我想在 date1、date2、date3、date4 应用的 AT TIME ZONE。

标签: python sql pandas


【解决方案1】:

正如已经指出的那样,这在您建议的方式中是不可行的,因为AT TIME ZONEAS 子句都应与每列一起出现。我建议做这样的事情。

query = """
    SELECT {date_cols_as_tz}, {table}.{id}
    FROM {table} 
    ORDER BY {table}.{id}
"""


def fun_query(table_name, list_col, id, tz="'Europe/Paris'"):
    date_cols_as_tz = ",".join((f"{c} AT TIME ZONE {tz} as {c}" for c in list_col))
    return query.format(date_cols_as_tz=date_cols_as_tz, table=table_name, list_col=list_col, id=id)

当你打电话时,例如fun_query("my_table", ["date1", "date2"], "table_id") 并打印出来你会得到以下查询:

SELECT date1 AT TIME ZONE 'Europe/Paris' as date1,date2 AT TIME ZONE 'Europe/Paris' as date2, my_table.table_id
FROM my_table 
ORDER BY my_table.table_id

主要变化是:

  • fun_query 内创建date_cols_as_tz
  • list_col 参数使用真实列表(不是"date1,date2" 之类的字符串,而是["date1", "date2"] 之类的列表)
  • 为函数添加了可选的tz 参数

此解决方案的优点是您可以通过为tz 使用不同的值而不是硬编码值来轻松更改时区。

另请注意,此函数要求 list_col 中的所有列都是日期(但如果我正确理解您的问题,这可能是您所期望的)。

【讨论】:

  • 谢谢 ^^ 我在测试您的建议时出错E LINE 2: SELECT ['date1', 'date2'], tab1.id
  • @tamo007 你能在这里发帖吗?你是怎么打电话给fun_query的? (你的参数是什么样的?)
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 2011-08-28
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多