我尝试用嵌套的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。
1条答案
按热度按时间nfs0ujit1#
错误在字典绑定(args变量)中。请忽略冒号! SQL中的冒号是为了让SQLite知道它是一个绑定。
如果APSW将缺少绑定视为错误而不是NULL,那将更有帮助。
(披露:我是APSW作者)