基于列值有条件地选择行

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 - 如何根据其值有条件地仅更改表格单元格(而不是行)的背景颜色?

基于 SegmentedControl 有条件地重新加载 UITableView

根据 selectOneMenu 值有条件地渲染组件

根据 selectOneMenu 值有条件地渲染组件

根据 selectOneMenu 值有条件地渲染组件