0

使用简单的查询,使用 bindargs 可以正常工作,但是一旦我在查询中包含选择案例.....它总是失败“不能为这个 sql 传递 bindargs”,如果我测试所有的 '?'s替换为固定值,它编译并运行正常,因此参数绑定似乎无法处理嵌入在选择案例中的选择。这是真的?

我正在编译的查询是:

(SELECT CASE 
    WHEN ((SELECT _id FROM point2D WHERE x=? AND y=?) IS NULL ) THEN 0
    ELSE (SELECT _id FROM point2D WHERE x=? AND y=? LIMIT 1))

并且表格设置为

create table if not exists point2D ( _id INTEGER PRIMARY KEY AUTOINCREMENT,
x REAL, y REAL )

我只想要一个已编译的查询,该查询返回现有匹配记录的键,或已知的“它不存在”值,但当然是一个简单的查询,例如

SELECT _id FROM point2D WHERE x=? AND y=? LIMIT 1

当没有找到任何东西时会导致 simpleQueryForLong 异常(这在 cpu 时间上非常昂贵)

我不能使用插入或更新,因为更新实际上用新行(因此是新的_id)替换了旧行,这搞砸了指向此的所有其他内容。

4

1 回答 1

1

您已将实际参数代码保密,但我猜您只提供了两个参数,尽管查询有四个。

如果您给它一个名称或数字,您可以多次使用一个参数:

(SELECT CASE 
    WHEN ((SELECT _id FROM point2D WHERE x=?1 AND y=?2) IS NULL ) THEN 0
    ELSE (SELECT _id FROM point2D WHERE x=?1 AND y=?2 LIMIT 1))

但是,对于这个特定的查询,您最好使用ifnull 函数

(SELECT ifnull((SELECT _id FROM point2D WHERE x=? AND y=?), 0))

(而且我怀疑实际上是否需要外部子查询。)

于 2013-05-27T17:16:11.707 回答