使用默认值从多行中选择一行

时间:2015-12-13 16:09:52

标签: sql

以下是我的表格:

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,依此类推。

我怎么能做这样的事情?是否可以在与数据库的一次交易中完成? (当然,我可以通过三个单独的查询来完成它,但这看起来效率很低。)

1 个答案:

答案 0 :(得分:4)

您可以使用LEFT JOINCOALESCE

来执行此操作
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 * iidx = 2 * i + 1的行匹配。如果这些索引中的任何一个(或两者都不匹配),则将选择default