【问题标题】:Python - Pandasql - IIf Function doesn't work ErrorPython - Pandasql - IIf 函数不起作用错误
【发布时间】:2019-07-18 09:48:57
【问题描述】:

尝试执行以下代码:

import pandas as pd
import pandasql as ps

df = pd.DataFrame({'A':[5,6,7], 'B':[7,8,9]})
print(df)

       A  B
    0  5  7
    1  6  8
    2  7  9

qry = """SELECT df.*, IIf(A Is Null,[B],[A]) AS NEW_A FROM df;"""
df1 = ps.sqldf(qry, globals())
print(df1)

产生此错误:

PandaSQLException: (sqlite3.OperationalError) no such function: IIf 
[SQL: 'SELECT df.*, IIf(A Is Null,[B],[A]) AS NEW_A FROM df;']

我尝试了关于方括号、全局/本地等的不同语法的各种组合,但找不到问题。这个功能根本不存在吗?

我只是从 MS Access 查询中复制了 SQL 查询,但对于其他情况,这可以正常工作。

【问题讨论】:

    标签: python pandas sqlite ms-access pandasql


    【解决方案1】:

    SQLite 中没有 iif() 函数。
    在这种情况下你可以使用coalesce():

    SELECT df.*, coalesce(A, B) AS NEW_A FROM df
    

    iif() 的功能可以通过CASE 语句来实现:

    SELECT df.*, CASE WHEN A is null THEN B ELSE A END AS NEW_A FROM df
    

    但在这种情况下coalesce() 更简单。

    更新
    从 SQLite 的 3.32.0 版本(2020-05-22)开始,支持函数iif()

    【讨论】:

    • 谢谢!由于这只是一个简化示例,我实际上需要 CASE 语句。也感谢您对 SQLite 的引用,以后我会先看那里。
    • 您能否评论一下为什么 SQLite 文档列出了 IIF 函数?这里:sqlite.org/lang_corefunc.html#iif
    • @MarcinWojnarski 自 SQLite (2020-05-22) 版本 3.32.0 起支持函数 iif()。在此处查看发布历史记录:sqlite.org/changes.html。是时候编辑我的答案了。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多