假设我有以下events
表:
Column | Type |
--------+---------+
id | integer |
type | integer |
事件type
可以是任何用户提供的号码,并且与此type
相关联的系统中的任何其他表都没有关系。
我的请求是生成报告,我需要将type
与用户提供的字符串相匹配。
用户可以提供以下内容:
1 = "Created event"
2 = "Deleted event"
3 = "Updated event"
这是过分简化,但你明白了。
现在我需要生成包含事件表的报告,而不是type
应该使用匹配的字符串。
我阅读了关于字符串函数的手册,发现replace
函数只能部分地解决问题 - 我只能替换类型:
select replace(type::text, '3', 'Updated event') from events;
这将返回所有事件行,只有类型为3
的行将具有正确的字符串,其他行将具有整数。
如何利用它来将type
与一个选择中的用户字符串相匹配?
答案 0 :(得分:5)
您需要case
表达式:
select case type
when 1 then 'Created event'
when 2 then 'Deleted event'
when 3 then 'Updated even'
else 'Unknown Type'
end as type_name
from events;
另一种选择(可能更灵活一点)是“即时”创建查找表:
with type_names (id, type_name) as (
values
(1, 'Created event'),
(2, 'Deleted event'),
(3, 'Updated event')
)
select e.id, coalesce(tn.type_name, 'Unknown type') as type_name
from events e
left join type_names tn on t.id = e.type;
如果事件的类型编号与预期的不同,则外连接是必需的。
答案 1 :(得分:1)
有条件的情况会做你想要的:
SELECT CASE
WHEN type=1 THEN 'Created event'
WHEN type=2 THEN 'Deleted event'
ELSE 'Updated event'
END
FROM events;