where 条件下列的多个值

问题描述 投票:0回答:1

我有一张桌子如下

create table auto
(
  ID number,
  SEQ number,
  COLUMN_NME varchar2(10),
  RELATIONAL_OPERATOR varchar2(20),
  COLUMN_VALUE varchar2(20)
);

insert into auto SELECT 1,1,'HONDA','=','ACCORD' FROM DUAL;
insert into auto SELECT 1,2,'ENGINE','=','V6' FROM DUAL;
insert into auto SELECT 1,3,'COLOR','=','BLACK' FROM DUAL;
insert into auto SELECT 1,4,'COLOR','=','BLUE' FROM DUAL;
insert into auto SELECT 2,1,'TOYOTA','=','SIENNA' FROM DUAL;
insert into auto SELECT 2,2,'COLOR','=','BLACK' FROM DUAL;
insert into auto SELECT 2,3,'ENGINE','<>','V6' FROM DUAL;
insert into auto SELECT 3,1,'HONDA','=','ODYSSEY' FROM DUAL;
insert into auto SELECT 3,1,'COLOR','<>','BLACK' FROM DUAL;
insert into auto SELECT 3,1,'ENGINE','=','V6' FROM DUAL;
insert into auto SELECT 3,1,'HONDA','=','CRV' FROM DUAL;

我需要结果在哪里

  • column_nme = '本田',COLUMN_VALUE = '雅阁'
  • COLUMN_NME=“颜色”,COLUMN_VALUE=“黑色”
  • COLUMN_NME = '引擎',COLUMN_VALUE = 'V6'

(考虑所有 RELATIONAL_OPERATOR 都是“=”)

我尝试使用案例陈述来编写

select ID,SEQ,case when column_nme = 'HONDA' and column_value = 'ACCORD' THEN 1 ELSE 0 END HONDA,
 CASE WHEN COLUMN_NME = 'ENGINE' AND COLUMN_VALUE = 'V6' THEN 1 ELSE 0 END ENGINE,
 CASE WHEN COLUMN_NME = 'COLOR' AND COLUMN_VALUE = 'BLACK' THEN 1 ELSE 0 END COLOR
 FROM AUTO;

我需要此表的 ID,其中 HONDA = 1,ENGINE = 1 AND COLOR = 1

sql oracle
1个回答
0
投票

您的表 auto 是一个 EAV(实体属性值)表,并且您希望 ID 匹配所有三个条件:

  • 本田 = 雅阁
  • 颜色 = 黑色
  • 发动机=V6

查询 EAV 表的典型方法是通过聚合:获取具有所有所需匹配项的所有 ID:

select id
from auto
group by id
having count(case when column_nme = 'HONDA'  and relational_operator = '=' and column_value = 'ACCORD' then 1 end) > 0
   and count(case when column_nme = 'COLOR'  and relational_operator = '=' and column_value = 'BLACK'  then 1 end) > 0
   and count(case when column_nme = 'ENGINE' and relational_operator = '=' and column_value = 'V6'     then 1 end) > 0;

演示:https://dbfiddle.uk/NEDty7pP

© www.soinside.com 2019 - 2024. All rights reserved.