用PostgreSql中的匹配字符串替换列整数值

时间:2017-09-07 19:26:12

标签: postgresql

假设我有以下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与一个选择中的用户字符串相匹配?

2 个答案:

答案 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;