当第一个 select 查询 returns 0 时从第二个 select 查询获取结果

Get result from second select query when first select query returns 0

我有以下架构

CREATE TABLE BookImage (Id UNSIGNED BIG INT, ImageId UNSIGNED BIG INT, IsDefault INT, 
                           PRIMARY KEY(Id, ImageId));

INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,10,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,11,1);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,12,0);

INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,20,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,21,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,22,0);

我的目标是获得一个 SELECT 查询来查找给定 "Id" 的 (ImageId, Id) 这样 -

  1. 如果 IsDefault=1,则 return 行
  2. 如果 IsDefault=0,则 return 最低 ImageId 的行

对于给定的 table,如果我使用 Id=1 查询,它应该 return 只有 (11,1) 如果我使用 Id=2 查询,它应该 return 只有 (20,2) 因为没有 IsDefault=1 for Id=2.

我需要一个 sqlite select 查询来实现它。我已经尝试过此 post 的查询,但它不起作用

SELECT * 
FROM BookImage 
WHERE Id=1 AND IsDefault=1
UNION ALL
SELECT * 
FROM BookImage 
WHERE Id=1 ORDER BY ImageId ASC LIMIT 1 AND NOT EXISTS (
    SELECT *
    FROM BookImage 
    WHERE Id=1 AND IsDefault=1 LIMIT 1 
)

http://sqlfiddle.com/#!5/e094e/1/0

具有ROW_NUMBER()window功能:

SELECT Id, ImageId
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY Id ORDER BY IsDefault DESC, ImageId) rn
  FROM BookImage
) b
WHERE rn = 1 AND Id = ?

? 替换为您要搜索的 Id
参见 demo.

另一种方式:

SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY ROW_NUMBER() OVER (ORDER BY IsDefault DESC, ImageId)
LIMIT 1

参见demo

对于不支持 window 函数的旧版 SQLite:

SELECT Id, ImageId 
FROM BookImage
WHERE Id = ?
ORDER BY IsDefault DESC, ImageId
LIMIT 1;

参见demo
Id = 1 的结果:

| Id  | ImageId |
| --- | ------- |
| 1   | 11      |

Id = 2 的结果:

| Id  | ImageId |
| --- | ------- |
| 2   | 20      |