SQLite、Python、APSW:参数化嵌套选择时出错

z6psavjg  于 2022-12-27  发布在  SQLite
关注(0)|答案(1)|浏览(145)

我尝试用嵌套的select语句查询一个sqlite数据库的一些数据,查询的最终结果需要用WHERE子句来限制,所以我用括号把“内部”的select语句括起来,命名为s1,然后再用另一个select语句把它括起来。
当在代码的最后一个WHERE中使用参数时(sql中倒数第二行),我得到了一个空结果,就好像表中没有数据一样。如果没有参数,只提供字符串'2018-12-31',它就工作得很好,我得到了4个元组的数据(我的预期结果)。但是我在WHERE子句(:jahresEnde)中使用的参数我也在select的其他地方使用。它是完全相同的。我做错了什么?
下面是我的代码:

sqlCommands = '''
SELECT Name, Einheit, Whg, von, bis FROM 
( 
SELECT B.Name, H.Einheit, H.ID as Whg, FkEinheit,
    CASE WHEN julianday(B.Einzug) < julianday(:jahresAnfang)
            THEN :jahresAnfang 
            ELSE B.Einzug 
        END von, 
    CASE WHEN julianday(B.Auszug) > julianday(:jahresEnde) 
            THEN :jahresEnde 
        WHEN B.Auszug == '' AND julianday(:jahresEnde) < julianday(DATE())
            THEN :jahresEnde 
        WHEN B.Auszug == '' AND julianday(:jahresEnde) > julianday(DATE())
            THEN DATE() 
        ELSE B.Auszug 
        END bis
FROM bewohner AS B INNER JOIN haus AS H 
    ON B.FkEinheit = H.ID 
WHERE julianday(bis) IS NULL 
              OR julianday(bis) >= julianday(:jahresAnfang)
) s1 
WHERE julianday(von) <= julianday(:jahresEnde)
ORDER BY FkEinheit DESC 
'''
args={
        ":jahresAnfang":'2018-01-01',
        ":jahresEnde":'2018-12-31'
}

cursor = db.cursor()
ok = cursor.execute(sqlCommands,args)

print (list(ok))

我之前也尝试过另一个sqlite模块:有了这个模块,它运行得很好,但是我在代码的另一个位置遇到了其他的麻烦,所以我想切换到apsw。

nfs0ujit

nfs0ujit1#

错误在字典绑定(args变量)中。请忽略冒号! SQL中的冒号是为了让SQLite知道它是一个绑定。

args={
        "jahresAnfang":'2018-01-01',
        "jahresEnde":'2018-12-31'
}

如果APSW将缺少绑定视为错误而不是NULL,那将更有帮助。
(披露:我是APSW作者)

相关问题