根据使用案例的键连接某些值
Concatenate certain values according to their keys using case
我想知道如何连接某些键的值。示例数据:
id
key
value
1
name
Alex
1
status
single
1
age
21
1
income
20K
1
hight
85
2
name
David
2
status
single
2
age
23
2
income
10K
2
hight
75
我尝试将每个 ID 仅连接三个键 Alex,21,85
。
所以我有类似的东西:
select case
when something then null
else concat(name.value, age.value, hight.value)
end
from names
那么为了获得这个值,concat 中应该包含什么?我不需要显示键,只需显示组合的值 Alex,21,85
或 David,23,75
每次每个 ID 的值都不同,因此无法对其进行硬编码。
如果我没理解错的话,你有一个动态的键列表,例如 name, age, hight
,你想为每个用户显示这些值。
您需要使用聚合和 string_agg
:
select id, string_agg(
"value", ','
) within group (order by charindex(',' + "key" + ',', ',name,age,hight,')) as csv
from t
where "key" in ('name', 'age', 'hight')
group by id
DDL
CREATE TABLE person (
p_id INT AUTO_INCREMENT PRIMARY KEY,
p_name VARCHAR(255) NOT NULL
);
INSERT INTO person (p_name) VALUES ("Alex"), ("David"), ("Kate"), ("Lisa"), ("Maya");
您需要的查询。还有更多选项可用,因此您可能想阅读 GROUP_CONCAT()
SELECT GROUP_CONCAT(p_name SEPARATOR ', ') as "string"
FROM person
WHERE p_id IN (2, 4, 5);
预期输出:
string
David, Lisa, Maya
我想知道如何连接某些键的值。示例数据:
id | key | value |
---|---|---|
1 | name | Alex |
1 | status | single |
1 | age | 21 |
1 | income | 20K |
1 | hight | 85 |
2 | name | David |
2 | status | single |
2 | age | 23 |
2 | income | 10K |
2 | hight | 75 |
我尝试将每个 ID 仅连接三个键 Alex,21,85
。
所以我有类似的东西:
select case
when something then null
else concat(name.value, age.value, hight.value)
end
from names
那么为了获得这个值,concat 中应该包含什么?我不需要显示键,只需显示组合的值 Alex,21,85
或 David,23,75
每次每个 ID 的值都不同,因此无法对其进行硬编码。
如果我没理解错的话,你有一个动态的键列表,例如 name, age, hight
,你想为每个用户显示这些值。
您需要使用聚合和 string_agg
:
select id, string_agg(
"value", ','
) within group (order by charindex(',' + "key" + ',', ',name,age,hight,')) as csv
from t
where "key" in ('name', 'age', 'hight')
group by id
DDL
CREATE TABLE person (
p_id INT AUTO_INCREMENT PRIMARY KEY,
p_name VARCHAR(255) NOT NULL
);
INSERT INTO person (p_name) VALUES ("Alex"), ("David"), ("Kate"), ("Lisa"), ("Maya");
您需要的查询。还有更多选项可用,因此您可能想阅读 GROUP_CONCAT()
SELECT GROUP_CONCAT(p_name SEPARATOR ', ') as "string"
FROM person
WHERE p_id IN (2, 4, 5);
预期输出:
string |
---|
David, Lisa, Maya |