我正在检索一个产品的多个功能,并希望将它们显示在一行中。以下是我目前正在检索的内容:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 null
766 null null 0
991 null 0 null
991 null null 0
一个产品可能具有零个或多个功能。我的目标是这样检索它们:
key waterproof oilfree parabenfree
183 1 null null
766 null 0 0
991 null 0 0
查询的表与下面的表类似,qualifier
定义了特性的类型。
key qualifier value
171 waterproof 1
766 oilfree 0
766 parabenfree 1
991 parabenfree 0
991 oilfree 0
在CASE WHEN
中,我为每个特征创建一列。当条件满足时,我想看看该产品的价值。但是,每行定义一个功能,这意味着可以为一个产品检索多行。
SELECT
CASE WHEN f.qualifier LIKE '%waterproof%'
THEN f.value END as waterproof,
CASE WHEN f.qualifier LIKE '%parabenfree%'
THEN f.value END as parabenfree,
CASE WHEN f.qualifier LIKE '%oilfree%'
THEN f.value END as oilfree
FROM
features f
我们是否能够在保持所需结构的同时,将这些行压缩为每个产品一行?
这里有一个可重复的例子:
-- create table
CREATE TABLE features (
key INTEGER,
qualifier TEXT,
value INTEGER
);
-- insert data
INSERT INTO features VALUES (183, 'waterproof', 1),
(766, 'oilfree', 0),
(766, 'oilfree', 1),
(991, 'parabenfree', 0),
(991, 'parabenfree', 1);
-- statement
SELECT
f.key,
CASE WHEN f.qualifier LIKE '%waterproof%'
THEN f.value END as waterproof,
CASE WHEN f.qualifier LIKE '%parabenfree%'
THEN f.value END as parabenfree,
CASE WHEN f.qualifier LIKE '%oilfree%'
THEN f.value END as oilfree
FROM
features f
联机版本:https://www.mycompiler.io/view/83oxmgk
您可以使用max((聚合结果以消除空值,例如:
select f.[key],
Max(case when f.qualifier like '%waterproof%' then f.value end ) as waterproof,
Max(case when f.qualifier like '%parabenfree%' then f.value end ) as parabenfree,
Max(case when f.qualifier like '%oilfree%' then f.value end ) as oilfree
from features f
group by f.[key];