【问题标题】:SQL: Get a random entry iff condition is falseSQL:如果条件为假,则获取随机条目
【发布时间】:2010-09-08 14:03:33
【问题描述】:

使用火鸟:

如果第一个 SQL 查询返回 0 行,我想在表中选择一个随机条目。有没有办法把这两个查询结合起来?

SELECT * FROM table WHERE cond=1;

SELECT FIRST 1 * FROM table ORDER BY rand();

我在 java 端使用 ExecuteNativeQuery,它采用基本的 SQL 语句。可悲的是,If-Else 语句不起作用。如果我可以对数据库进行一次查询而不是两次,那将使我的代码看起来更快。

【问题讨论】:

    标签: sql mysql firebird


    【解决方案1】:

    试试这个:不确定,但认为它会起作用......

    Select FIRST 1 t1.* 
    FROM table t1
       left Join Table t2
          On t2.pk = t1.pk
             And t2.cond=1
    ORDER BY Case When t2.Cond = 1 
                  Then 0 Else rand() End  
    

    【讨论】:

    • 看起来很有希望,但条件是我卡住的地方。如果不满足条件,则返回 0 行。另外,是否应该颠倒顺序和条件?
    • 似乎绕过了条件,只是返回了一个随机行。
    • 只有在表中没有 cond = 1 的行时才应该这样做。检查Select * From table Where Cond = 1 并查看它返回的内容...
    • cond=1 确实返回一行。
    • 好的 nvm 你的查询确实有效,但是它返回两组行,一组来自 t1 和 t2(左连接,是的)。如果不满足条件,t2 set 为 null,t1 始终返回随机行。我想我可以解决这个问题,非常感谢。
    【解决方案2】:
    if(exists(select 1 from table where cond=1))
    SELECT * FROM table WHERE cond=1;
    else
    SELECT FIRST 1 * FROM table ORDER BY rand();
    

    类似这样,虽然我忘记了在 FirebirdSQL 数据库中的 if 语句中是否需要 then 关键字。

    【讨论】:

    • 我在 java 端使用 ExecuteNatieQuery,它采用基本的 SQL 语句。可悲的是,If-Else 语句不起作用。不过还是谢谢。
    猜你喜欢
    • 2012-11-22
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2016-10-16
    • 2015-08-20
    • 2022-10-24
    • 2011-12-18
    相关资源
    最近更新 更多