Sqlite 当第一个选择查询返回0时,从第二个选择查询获取结果

Sqlite 当第一个选择查询返回0时,从第二个选择查询获取结果,sqlite,sqliteopenhelper,Sqlite,Sqliteopenhelper,我有以下模式 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 BookImag

我有以下模式

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);
我的目标是为给定的“Id”获取一个SELECT查询来查找(ImageId,Id),以便-

  • 如果IsDefault=1,则返回该行
  • 如果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 
    )
    

    带有
    行号()
    窗口功能:

    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      |
    

    谢谢你的帮助。但这不是我想要的东西。如果我用Id=1搜索,它应该只重新运行(11,1)。如果我用id=2查询,那么它应该只返回(20,2)。检查我编辑的答案。代替是的,这正是我要找的。但是你的陈述在这里失败了:你能看一看吗?@JohnCooper检查另一个更简单的方法。我猜你链接中的fiddle使用了不支持窗口函数的SQLite的旧版本。