Select 如果特定列具有值,则多行

Select multiple rows if specific columns have value

我有一个像这样的table(简体):

Table 名称:产品

productId, property, value
----------------------------
1, color, red
1, shape, square
1, price, 1.00
...
2, color, green
2, shape, triangle
2, price, 0.50
...
10, color, red
10, shape, circle
10, price, 3.00
...

我简化了它,但我希望它有意义。对于一个特定的数据集,我有多个行,在这种情况下是产品。每行描述产品的不同属性。

我现在想要 select 所有具有特定属性的产品,假设 colorred 的所有产品。但不仅是颜色为红色的行,而且 colorred.

的每个产品的每一行

对不起,这描述得很糟糕,但我希望你明白我的意思。鉴于上面的 table 结构,如果我想 select 所有红色产品,我想以这样的方式结束:

productId, color, shape, price
-------------------------------
1, red, square, 1.00
10, red, circle, 3.00

这有意义吗?也许有人可以提供帮助。

顺便说一句:我无法更改给定的 table 结构。它来自外部应用程序。

一种方法使用 exists:

select p.*
from products p
where exists (select 1
              from products p2
              where p2.productId = p.productId and
                    p2.property = 'color' and p2.value = 'red
             );

如果你想要一行一行,那么你可以使用条件聚合来总结:

select p.productid,
       max(case when p.property = 'color' then p.value end) as color,
       max(case when p.property = 'shape' then p.value end) as shape,
       max(case when p.property = 'price' then p.value end) as price
from products p
group by productId
having max(case when p.property = 'color' then p.value end) = 'red';

查看 pivot 命令。如果列是静态的,这是我发现将行转换为列的最佳方法。如果不是,则可以通过动态 sql 来完成,但会稍微复杂一些。我使用该方法为产品属性构建视图,这听起来与您在此处所做的非常相似。