3

我准备了一个左外连接查询,当我的 BLOB 表中存在与我的 INCIDENT 表中的记录匹配的键的记录时,它应该返回非空数据。

本质上,数据和查询如下所示:

表 A
   钥匙

表 B
   钥匙
   斑点

我正在运行的查询应该显示来自 A 的所有记录,如果 B 中存在具有匹配键列的记录,则“hasb”列应该为 1,如果没有,则应该为 0。所以查询应该是这样的:

SELECT A.*, ifnull(A.Key = B.Key, 0) as hasb FROM A
LEFT OUTER JOIN B ON A.Key = B.Key

好的,所以我的问题是,这个查询似乎在我尝试使用它的任何地方都有效,除了在 Android 设备上。

这是一个带有实际表和查询的 SQLFiddle。请注意,查询在那里有效。

http://sqlfiddle.com/#!7/89e7d/4

有人知道为什么这在Android上不起作用吗?我正在测试的设备是运行 Android 4.1.1 的三星 Galaxy S 3。

4

2 回答 2

2

我认为您使用ifnull.

这是您小提琴中的查询:

SELECT ifnull( a.userid = b.userid, 0 ) FROM incidentdata AS a
LEFT OUTER JOIN incidentblob AS b
ON ( a.userid = b.userid ) AND ( a.incidenttag = b.incidenttag );

这是我要写的查询:

SELECT a.userid, a.incidenttag, b._id, b._id is not null hasb
FROM incidentdata AS a
LEFT JOIN incidentblob AS b
ON a.userid = b.userid AND a.incidenttag = b.incidenttag

它有效吗?如果不满意,请提供您正在使用的 SQLite 版本。无论如何,我很确定问题存在于以下项目中:

  • 理解null = null不会返回TRUE,而是null
  • null值存在于两者b.userid以及a.incidenttag执行之后left join
于 2013-10-01T17:54:06.927 回答
0

我知道您的查询“似乎无处不在”。

但是,我建议您使用另一种方法:

SELECT a.*, b.ROWID IS NOT NULL AS hasb FROM a LEFT JOIN b ON a.key IS b.key;

差异:

  • 避免IFNULL函数调用;
  • a.key IS b.key将处理一个空键值;
  • 检查b.ROWIDb独立于行数据的。
于 2013-10-02T08:51:11.900 回答