SQL选择行,其中多值字段的值仅出现一次

时间:2018-07-05 07:33:59

标签: sql oracle

我有以下问题:

我有一个表,表中有不同的列描述对象。假设此列之一可以包含值1,2,3,4,5,6,7,8,9,10。在此表中,对象可以包含所有这些值,或者某些对象仅包含例如值1,3,5(所以0到n个值)

现在,我想查找仅包含值1和2的所有对象,但是如果它们包含1,2,3或(1,2)或其他组合,则不希望它们出现在结果集中。

如何编写此SQL语句?

样本数据(预期结果->马克和迈克尔):

pub/media/import

3 个答案:

答案 0 :(得分:2)

您可以使用分析计数来查看每个对象具有多少个特征,以及正在寻找多少个特征?然后比较这些计数:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    count(distinct obj_characteristic) over (partition by obj) as c1,
    count(distinct case when obj_characteristic in (1,2) then obj_characteristic end)
      over (partition by obj) as c2
  from your_table
)
where c1 = c2;

使用您的示例数据可以得出:

OBJ     OBJ_CHARACTERISTIC CHARACTERI
------- ------------------ ----------
Mark                     1 2018-01-15
Mark                     2 2018-02-15
Michael                  1 2018-06-15
Michael                  2 2018-07-15

从问题的措词方式来看,听起来像是要完整的行,如上所述;从注释中,您可能只需要名称。如果是这样,您可以将外部选择更改为:

select distinct obj
from ...

OBJ    
-------
Mark
Michael

或通过having子句使用聚合:

select obj
from your_table
group by obj
having count(distinct obj_characteristic)
  = count(distinct case when obj_characteristic in (1,2) then obj_characteristic end);

OBJ    
-------
Mark
Michael

db<>fiddle demo of all three


在这种情况下,由于1和2是连续的,因此您也可以使用min / max进行此操作,以使其总和来获得名称:

select obj
from your_table
group by obj
having min (obj_characteristic) = 1
and max(obj_characteristic) = 2;

或通过分析获得完整的行:

select obj, obj_characteristic, characteristic_date_added
from (
  select obj, obj_characteristic, characteristic_date_added,
    min(obj_characteristic) over (partition by obj) as min_char,
    max(obj_characteristic) over (partition by obj) as max_char
  from your_table
)
where min_char = 1
and max_char = 2;

但较早的版本更通用。

答案 1 :(得分:1)

如果您只是想查找sql​​以返回行值'1,2',而没有其他用途,则使用:

select * from table where column like '%1,2'

发布数据示例,可能更有助于理解。

答案 2 :(得分:0)

@ dwin90您可以尝试:

SELECT obj
FROM your_table
WHERE (OBJ_CHARACTERISTIC=1 OR OBJ_HARACTERISTIC=2 AND OBJ_CHARACTERISTIC !> 2
)GROUP BY OBJ