基于列值有条件地选择行
Posted
技术标签:
【中文标题】基于列值有条件地选择行【英文标题】:Conditional selecting rows based on a column value 【发布时间】:2013-06-27 11:32:47 【问题描述】:ID RANGE_ID START_DATE END_DATE BAND_TYPE FLAG_LINE
3 1 01/03/2013 31/03/2013 R 1
4 1 01/03/2013 31/03/2013 R 0
5 2 01/03/2013 31/03/2013 R 1
6 2 01/03/2013 31/03/2013 R 0
7 3 01/03/2013 31/03/2013 R 0
8 3 01/03/2013 31/03/2013 N 0
从这个表中,对于每个 RANGE_ID,我需要使用以下条件选择行: 如果存在具有相同列的行(除了 ID 字段),则仅选择具有 FLAG_LINE = 1 的行,如果存在相同的行但它们都不包含 FLAG_LINE=1 列,则选择所有行,基于此查询应返回以下结果:
ID RANGE_ID START_DATE END_DATE BAND_TYPE FLAG_LINE
3 1 01/03/2013 31/03/2013 R 1
5 2 01/03/2013 31/03/2013 R 1
7 3 01/03/2013 31/03/2013 R 0
8 3 01/03/2013 31/03/2013 N 0
我尝试分块进行:即为每个 RANGE 运行类似的东西:
begin
for x in ( select count(*) cnt
from dual
where exists (
select 1 FROM myTable
WHERE RANGE_ID = 1 AND FLAG_LINE = 1) )
loop
if ( x.cnt = 1 )
then
dbms_output.put_line('flag line exists');
--insert the line with FLAG_LINE = 1 into temp table for this range
else
dbms_output.put_line('does not exist');
--insert the lines into temp table for this range
end if;
end loop;
end;
对每个 RANGE 使用这个方法我填充一个临时表并在最后返回结果,但这不是很灵活,还有其他方法可以实现吗?
谢谢
【问题讨论】:
【参考方案1】:试试这样...
Select * from tablename where flag=1
union
(Select * from tablename a where (Select count(*) from tablename b
where a.Range_id=b.RANGE_ID and b.flag=1)<1)
SQL FIDDLE Demo
【讨论】:
【参考方案2】:试试这个。
select * from myTable
where flag_line = 1
or
(range_id, start_date, end_date, band_type) in (
select range_id, start_date, end_date, band_type
from myTable
group by range_id, start_date, end_date, band_type
having max(flag_line) = 0)
【讨论】:
【参考方案3】:这是获得所需结果的另一种方法
SELECT *
FROM info
WHERE flag_line = 1
UNION
SELECT *
FROM info i1
WHERE NOT EXISTS (SELECT NULL
FROM info i2
WHERE i2.range_id = i1.range_id
AND i2.flag_line = 1
)
【讨论】:
以上是关于基于列值有条件地选择行的主要内容,如果未能解决你的问题,请参考以下文章
ReactJS 7 - 如何根据其值有条件地仅更改表格单元格(而不是行)的背景颜色?