当第一个选择查询的结果为0时,从第二个选择查询中获取结果。

问题描述 投票:0回答:1

我有以下模式

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,则返回该行。
  2. 如果IsDefault=0,则返回最低的ImageId的行。

对于给定的表,如果我用Id=1查询,应该只返回(11,1),如果我用Id=2查询,应该只返回(20,2),因为Id=2没有IsDefault=1。

我需要一个sqlite select查询来实现这个目标。我已经尝试了这个查询 职位 但这是行不通的

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#!5e094e10。

sqlite sqliteopenhelper
1个回答
1
投票

含有 ROW_NUMBER() 窗口功能。

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 你搜索的。请看 演示.

另一种方式。

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

演示.

对于不支持窗口函数的SQLite旧版本。

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

参见 演示. 结果 Id = 1:

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

结果 Id = 2:

| Id  | ImageId |
| --- | ------- |
| 2   | 20      |
© www.soinside.com 2019 - 2024. All rights reserved.