检查所有行是不是符合给定条件
Posted
技术标签:
【中文标题】检查所有行是不是符合给定条件【英文标题】:Check that all rows match a given criterion检查所有行是否符合给定条件 【发布时间】:2009-07-09 11:51:18 【问题描述】:requestId Consultantid statusid
1 2 10
2 2 10
3 2 10
我想检查每一行的 statusid 是否为 10。
if (every row has a statusid of 10) then
-----do this
endif;
【问题讨论】:
我想检查所有 statusid 值是否必须等于 10,如果单个 statusid 值不是 10,那么条件应该返回 false @secko :-我不想检查任何一个,我想检查 statusid =10 的每个字段 select * from blablabla_table where if(statusid = 10) then something, something else return false end if; 你得到了一些不错的答案,检查一下!还要检查,java2s.com/Tutorial/Oracle/0440__PL-SQL-Statements/… @ Welbog ...让我试试.. tnks Welbog,Secko 【参考方案1】:我对 PL-SQL 有点生疏了,但是这样的东西在 T-SQL 中可以工作:
if not exists (select * from your_table where statusid <> 10) then
-- whatever
end
编辑: 好的,显然在 PL-SQL 中,您需要执行以下操作:
DECLARE
notallten INTEGER;
BEGIN
SELECT COUNT(*) INTO notallten
FROM your_table
WHERE statusid <> 10
AND ROWNUM = 1;
IF notallten = 0 THEN
-- Do something
END IF;
END;
不过,我没有要测试的 Oracle 服务器。
【讨论】:
这在 SQL Server 中有效,但在 Oracle PL/SQL 中无效,不能这样混合。 SQL 无法处理布尔变量。 为什么需要ROWNUM?没有那个看起来不错。【参考方案2】:declare
v_exists_status_10 number(1);
...
begin
...
-- v_exists_status_10 = 0 if no such row exist, 1 if at least one does
select count(*)
into v_exists_status_10
from dual
where exists
(select * from your_table where statusid <> 10);
if v_exists_status_10 > 0 then
...
请注意,您也可以对变量执行愚蠢的 COUNT(),但与 EXISTS 相比,它的效率可能非常低。使用 COUNT(),您必须扫描所有记录,而使用 EXISTS,只要它达到 statusid = 10,它就可以停止扫描。
【讨论】:
【参考方案3】:更简单的解决方案,在 statusid 中考虑 NULL:
for r in (
select 1 dummy
from your_table
where (statusid != 10 or statusid is null)
and rownum = 1) loop
-----do this
end loop;
【讨论】:
以上是关于检查所有行是不是符合给定条件的主要内容,如果未能解决你的问题,请参考以下文章