How can I return the number of values in each row which match a criterion?
I think you are going to have to roll your own. 

I'd do something like the below. (last query finds first 10 records that have exactly 2 readings above my threshold). 

/*

Script for trial voltage query on DBSE

*/

drop table voltages;

Create table voltages(
    id  number 
,   v1  number
,   v2  number
,   v3  number);

alter table voltages add constraint pk_voltages
primary key(id);

/* 
add 10,000 rows 
v1 between 0 and 10
v2 between 0 and 100
v3 between 5 and 15
*/

insert into voltages (id,v1,v2,v3)
select rownum, dbms_random.value(0,10),dbms_random.value(0,10),dbms_random.value(0,10)
from dual
connect by level &lt;= 10000;

commit;

create or replace function above_threshold(p_thresh in number, v1 in number, v2 in number, v3 in number)
return number
as
l_retval number := 0;
begin
   if  v1 &gt; p_thresh 
    then l_retval := l_retval + 1;
   end if;  
   if 
       v2 &gt; p_thresh 
    then l_retval := l_retval + 1;
   end if;
   if 
       v3 &gt; p_thresh 
    then l_retval := l_retval + 1;
  end if;
  return l_retval;
end;
/

/* display those that have 2 readings above threshold */

select id,v1,v2,v3
from voltages
where above_threshold(8,v1,v2,v3) = 2
and rownum &lt;= 10;