选择使用列的值

时间:2017-05-11 12:47:46

标签: sql oracle

我有一个项目表,由其唯一ID标识,以及一些属性。

为保持表的可读性,该属性始终存储在“prop_value”列中,其类型存储在“prop_type”列中

为了简化,我只使用了三个属性,实际上有12个。

+----+-------------+-------------+
+ ID + prop_type   +  prop_value +
+----+-------------+-------------+
+ 1  +    prop1    +   foo       +
+----+-------------+-------------+
+ 1  +    prop3    +   toto      +
+----+-------------+-------------+
+ 3  +    prop2    +  lorem      +
+----+-------------+-------------+  

目的是获取sigle行中项目的所有属性,结果如下:

+----+-------------+-------------+-------------+
+ ID +     prop1   +    prop2    +      prop3  +
+----+-------------+-------------+-------------+
+ 1  +    foo      +   NULL      +    toto     +
+----+-------------+-------------+-------------+
+ 2  +    NULL     +   lorem     +    NULL     +
+----+-------------+-------------+-------------+

一开始,我使用了一个非常难看的解决方案:

select prop1 from myTable where id = 1
select prop2 from myTable where id = 1
...

既然我正在扩展它,它将永远消失,我想在一个查询中进行。

我尝试过类似的事情:

select a.prop_value, b.prop_value, c.prop_value from myTable a FULL JOIN myTable b FULL JOIN myTable c ...

但感觉我正在进入比它需要的更复杂的东西。

是否有实现这一目标的紧凑型解决方案?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

使用PIVOT

SELECT *
FROM   your_table
PIVOT  ( MAX( prop_value ) FOR prop_type IN (
  'prop1' AS prop1,
  'prop2' AS prop2,
  'prop3' AS prop3
) )

答案 1 :(得分:1)

您可以使用某些条件逻辑(例如CASE语句)以及聚合函数来获取结果:

select Id,
  max(case when prop_type = 'prop1' then prop_value end) as Prop1,
  max(case when prop_type = 'prop2' then prop_value end) as Prop2,
  max(case when prop_type = 'prop3' then prop_value end) as Prop3
from myTable
group by Id;

此类查询将行值转换为列。