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 所有具有特定属性的产品,假设 color
为 red
的所有产品。但不仅是颜色为红色的行,而且 color
为 red
.
的每个产品的每一行
对不起,这描述得很糟糕,但我希望你明白我的意思。鉴于上面的 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 来完成,但会稍微复杂一些。我使用该方法为产品属性构建视图,这听起来与您在此处所做的非常相似。
我有一个像这样的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 所有具有特定属性的产品,假设 color
为 red
的所有产品。但不仅是颜色为红色的行,而且 color
为 red
.
对不起,这描述得很糟糕,但我希望你明白我的意思。鉴于上面的 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 来完成,但会稍微复杂一些。我使用该方法为产品属性构建视图,这听起来与您在此处所做的非常相似。