例如
No Condition
1 NULL
2 O
3 NULL
4 NULL
5 NULL
6 NULL
7 NULL
8 O
9 NULL
10 NULL
11 NULL
12 O
想要选择具有NULL条件的No并且下面两个记录也具有NULL条件的SQL是什么?
对于这个表,应该选择3、4、5和9
假设no
是连续的,没有间隔-就像您的示例数据一样-那么您可以使用join
:
select t.no
from t join
t1
on t1.no = t.no + 1 join
t2
on t2.no = t.no + 2
where t.condition is null and
t1.condition is null and
t2.condition is null;
假设No
字段没有空白(如问题所示),在增加No
值时自连接表3次,并选择所有Condition
字段为空的记录:
select t1.No
from yourtable t1
inner join yourtable t2 on t1.No+1=t2.No
inner join yourtable t3 on t1.No+2=t3.No
where t1.Condition is null and t2.Condition is null and t3.Condition is null
一种选择是使用相关子查询来检索下两行的条件列的值。例如:
SELECT t1.no
FROM mytable t1
WHERE t1.condition IS NULL
AND ( SELECT (t2.condition IS NULL)
FROM mytable t2
WHERE t2.no > t1.no
ORDER BY t2.no
LIMIT 0,1
)
AND ( SELECT (t3.condition IS NULL)
FROM mytable t3
WHERE t3.no > t1.no
ORDER BY t3.no
LIMIT 1,1
)
ORDER BY t1.no
这并不一定会提供最好的性能。但这是有效的MySQL语法,它确实返回指定的结果集。
假设在No列中有一个空白,目的是检查No
值较高的后面两行。如果规范只检查No+1
和No+2
行,那么> t1.no
可以替换为= t1.no + 1
和= t1.no + 2
,并用LIMIT 0,1
替换LIMIT 1,1
。