选择范围[0,44]的最小值不在列中

时间:2013-08-09 05:33:29

标签: mysql sql

我有一个带有int值列的表,其值介于0和43之间(均包含在内)。

我想要一个返回范围[0,44]的最小值的查询,该值不在表中。

例如:
如果表包含:3,5,14。查询应返回0
如果表包含:0,1,14。查询应返回2
如果表包含:0,3,14。查询应返回1

如果表包含所有值,则查询应返回空。

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:5)

由于您想要的值是0或者大于表中存在的值,您可以这样做;

SELECT MIN(value)
FROM (SELECT 0 value UNION SELECT value+1 FROM MyTable) a
WHERE value < 44 AND value NOT IN (SELECT value FROM MyTable)

An SQLfiddle to test with

答案 1 :(得分:1)

一种方法是创建另一个包含[0,43]中的整数的表,然后将其连接并查找NULL,NULL将告诉您缺少哪些值。

假设你有:

create table numbers (n int not null);

,此表包含0到43(含)的整数。如果您的表格为t并且列n包含感兴趣的数字,那么:

select n.n
from numbers n left join t on n.n = t.n
where t.n is null
order by n.n
limit 1

应该为您提供您之后的结果。

当您使用序列时,这是一种相当常见的SQL技术。最常见的用途可能是日历表。

答案 2 :(得分:0)

一种方法是生成一组具有整数值的44行,然后对表中的不同值集执行反连接,并获取最小值。

SELECT MIN(r.val) AS min_val
  FROM ( SELECT 0 AS val UNION ALL
         SELECT 1 UNION ALL
         SELECT 2 UNION ALL
         SELECT 3 UNION ALL
         SELECT 4 UNION ALL
         SELECT 5 UNION ALL
         -- ... 
         SELECT 44 
       ) r
  LEFT
  JOIN ( SELECT t.int_valued_col
           FROM mytable t
          WHERE t.int_valued_col >= 0
            AND t.int_valued_col <= 43
          GROUP BY t.int_valued_col
       ) v
    ON v.int_valued_col = r.col
 WHERE v.int_valued_col IS NULL

答案 3 :(得分:0)

有点hacky和MySQL特定:

SELECT NULLIF(MAX(IF(val=@min, @min:=(val+1), @min)), @max) as min_empty
FROM (
  SELECT DISTINCT val
  FROM table1
  -- WHERE val BETWEEN 0 AND 43
  ORDER BY val) as vals, (SELECT @min:=0, @max:=44) as init;