我有以下问题:
我有一个表,表中有不同的列描述对象。假设此列之一可以包含值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
答案 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
在这种情况下,由于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