如何获取参数满足要求或不存在的所有值

时间:2017-04-03 15:31:18

标签: sql oracle

我想这应该是SQL中常见的用例,但我找不到任何东西。

我有两个表格ITEMPARAMETERITEM_ID链接,看起来像这样

====ITEM===========    ====PARAMETER===============
ID  | OTHER_COLUMNS    ID  | ITEM_ID | NAME | VALUE
===================    ============================
0                      100   0        param1  xxx   
1                      101   1        param1  yyy 
2                      102   1        param2  zzz

现在我想根据参数过滤项目,但也要获取PARAMETER中没有定义值的项目。

例如,我想选择param2=zzz的所有项目。

所以选择看起来像这样:

Select * from ITEM left join PARAMETER on ITEM.id=PARAMETER.item_id 
where NAME='param2' and VALUE='zzz';

这将选择ID为1的ITEM,但不选择ID为0的ITEM,因为ITEM 0根本没有设置参数。

我唯一想到的是选择所有ID并过滤出参数存在但不匹配的ID。

select ID from ITEM where ID not in ( 
   select ID from ITEM left join PARAMETER on ITEM.id=PARAMETER.item_id 
       where NAME='param2' and VALUE <> 'zzz');

这种方法很好,但是当我想要通过多个参数进行过滤时,会很快变得混乱。有没有更好的方法呢?

Oracle Dialect

1 个答案:

答案 0 :(得分:1)

试试这个

select *
  from item
  left join parameter
    on item.id = parameter.item_id
 where name is null
    or name not in ('param2') -- ('param2'[, 'paramN'])
    or name = 'param2' and (value = 'zzz' or value is null)
   --[or name = 'paramN' and (value = 'valueN' or value is null)]

版本2:

您的查询稍有改进(排除了一个连接):

select id
  from item
 where id not in (select item_id
                    from parameter
                   where name = 'param2' and value <> 'zzz'
--                      or name = 'paramN' and value <> 'valueN'
                 );