【问题标题】:MySQL - Get first non empty result from multiple where clausesMySQL - 从多个 where 子句中获取第一个非空结果
【发布时间】:2017-05-08 14:56:42
【问题描述】:

在 MySQL 中,是否可以设置一个查询,从一组 WHERE 子句中返回第一个非空结果。例如,如果我有一张桌子

|id  |a   |b   |
----------------
1     2    3
4     5    6
7     8    9

这些列是唯一的,我想要一个查询,几乎像

SELECT * FROM t
WHERE id = NULL OR a = 2 OR b = 6

只返回第一行以匹配任何 OR 子句,顺序为idab,几乎就像一个 COALESCE。

以下是一些示例查询和预期结果

SELECT * FROM t WHERE id = 7 OR a = 99 OR b = 3 --> (7, 8, 9)
SELECT * FROM t WHERE id = 7 OR a = NULL OR b = NULL --> (7, 8, 9)
SELECT * FROM t WHERE id = NULL OR a = 5 OR b = 77 --> (4, 5, 6)
SELECT * FROM t WHERE id = NULL OR a = NULL OR b = 6 --> (4, 5, 6)
SELECT * FROM t WHERE id = 1 OR a = 5 OR b = 9 --> (1, 2, 3)

这可能吗?

【问题讨论】:

  • 我不确定您的问题是什么,因为您的数据没有任何 id = NULL 可以添加更多行并指定所需的输出和更多测试用例
  • @JuanCarlosOropeza 我添加了更多示例结果
  • 您需要一个订单登录。例如,在您的第三个示例中:ID IS NULL OR a = 5 OR b = 77 如果您有两行 {NULL, 5, NULL}{NULL, NULL, 77} 会显示哪一行?
  • 我们应该显示{NULL, 5, NULL} 行,因为它匹配应该优先于b 列的a
  • 那你为什么不接受juergen的回答呢?

标签: mysql


【解决方案1】:
SELECT * FROM t
WHERE id IS NULL 
   OR a = 2 
   OR b = 6
order by case when id IS NULL then 1
              when a = 2 then 2
              when b = 6 then 3
         end
limit 1

【讨论】:

    【解决方案2】:

    如果id 是表的主键,您可以通过合并来实现:

    SELECT * FROM t 
    WHERE id IN 
    (SELECT COALESCE ((SELECT id FROM t WHERE id IS NULL),
            COALESCE ((SELECT id FROM t WHERE a = 2),
                      (SELECT id FROM t WHERE b = 6))))
    ORDER BY id
    LIMIT 1;
    
    SELECT * FROM t 
    WHERE id IN 
    (SELECT COALESCE ((SELECT id FROM t WHERE id = 7),
            COALESCE ((SELECT id FROM t WHERE a = 99),
                      (SELECT id FROM t WHERE b = 3))))
    ORDER BY id
    LIMIT 1;
    

    这里假设您所说的“第一行”是id 最低的那一行。

    【讨论】:

    • 我所说的第一行是第一行匹配任何 where 约束,按id a b 的顺序排列
    猜你喜欢
    • 2018-01-31
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2014-06-06
    相关资源
    最近更新 更多