以下是我的表格:
Table items
idx bigint unique
merkle char(64)
tag text
digest char(64)
由于idx
是唯一的,我将使用下标运算符[]
来表示与idx
指定的字段相对应的字段,例如merkle[i]
我将表示行中的merkle字段,其idx
值为i
。
我想要的是一个查询,对于给定的i,选择tag[i], digest[i], merkle[2 * i], merkle[2 * i + 1]
,使用merkle[2 * i]
和merkle[2 * i + 1]
的默认值,如果这些idx
不存在任何行值。
例如,假设我有
idx merkle tag digest
1 merk1 tag1 dig1
我希望我的查询返回tag1, dig1, "default", "default"
。如果我有
idx merkle tag digest
1 merk1 tag1 dig1
2 merk2 tag2 dig2
如果我有
,我想获得tag1, dig1, merk2, "default"
idx merkle tag digest
1 merk1 tag1 dig1
2 merk2 tag2 dig2
3 merk3 tag3 dig3
我想获得tag1, dig1, merk2, merk3
,依此类推。
我怎么能做这样的事情?是否可以在与数据库的一次交易中完成? (当然,我可以通过三个单独的查询来完成它,但这看起来效率很低。)
答案 0 :(得分:4)
您可以使用LEFT JOIN
和COALESCE
SELECT t1.idx, t1.tag, t1.digest,
COALESCE(t2.merkle, 'default'),
COALESCE(t3.merkle, 'default')
FROM mytable AS t1
LEFT JOIN mytable AS t2 ON t2.idx = 2 * t1.idx
LEFT JOIN mytable AS t3 ON t3.idx = 2 * t1.idx + 1
这会将idx = i
的每一行与idx = 2 * i
和idx = 2 * i + 1
的行匹配。如果这些索引中的任何一个(或两者都不匹配),则将选择default
。