多列

时间:2015-08-04 06:47:37

标签: sql oracle

我在oracle SQL中遇到了一个我无法解决的问题,所以我希望你们可以帮助我。 我正在尝试过滤多列中的多个ID,每个ID可以出现在至少一列中。这是我迄今取得的成就:

select name, ident1, ident2, ident3, ident4, ident5, ident6, last_modified
from ident_history
where ((ident1 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')
or ident2 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')
or ident3 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')
or ident4 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')
or ident5 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')
or ident6 in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44'))
order by last_modified desc

嗯,这很有用,但是我希望有一个不那么复杂的方法,因为我有大约20个包含ID的列和大约100个要与之比较的ID,这使得代码非常混乱。我想到了这样的事情:

where (ident1, ident2, ident3, ident4, ident5, ident6) in ('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44')

但这不起作用。如果您有任何想法,我们将不胜感激。

1 个答案:

答案 0 :(得分:4)

这是不可能的。另一种选择是:

with t
as
( select '1SP563' v from dual
  union all
  select 'T6R840' v from dual
  union all
  select 'FF764P' v from dual
  union all
  select 'T753RM' v from dual
  union all
  select '54T56A' v from dual
  union all
  select '4386HA' v from dual
  union all
  select '667R44' v from dual
)
select name, ident1, ident2, ident3, ident4, ident5, ident6, last_modified
from   tomis_rep.t_fact_fertigungen_comp fc
join   t
on     t.v in (ident1, ident2, ident3, ident4, ident5, ident6)
order
by     last_modified desc

相反,你也可以加入(临时)表,这有点相同。

它会阻止您之前查询中的某些重复,但并不完美。原因是我认为你没有足够规范你的模型。这就是结果。

或许有点hackish:

select name, ident1, ident2, ident3, ident4, ident5, ident6, last_modified
from   tomis_rep.t_fact_fertigungen_comp fc
join   ( select column_value v
         from   table(sys.dbms_debug_vc2coll('1SP563', 'T6R840', 'FF764P', 'T753RM', '54T56A', '4386HA', '667R44'))
       ) t
on     t.v in (ident1, ident2, ident3, ident4, ident5, ident6)
order
by     last_modified desc