我有一个带有int值列的表,其值介于0和43之间(均包含在内)。
我想要一个返回范围[0,44]的最小值的查询,该值不在表中。
例如:
如果表包含:3,5,14。查询应返回0
如果表包含:0,1,14。查询应返回2
如果表包含:0,3,14。查询应返回1
如果表包含所有值,则查询应返回空。
我怎样才能做到这一点?
答案 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)
答案 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;