我正在从PostgreSQL数据库(我无法控制)中读取,该数据库包含一个整数列,其行为类似于枚举,但枚举值不在数据库中。
这不是我的实际数据,但请考虑一个示例students
表:
id | name | class
==================
1 | Adam | 1
2 | Bruce | 1
3 | Chris | 3
4 | Dave | 4
从此表SELECT
开始,将class
列转换为更人性化的内容非常常见:
SELECT
id,
name,
CASE class
WHEN 1 THEN 'Freshman'
WHEN 2 THEN 'Sophomore'
WHEN 3 THEN 'Junior'
WHEN 4 THEN 'Senior'
ELSE 'Unknown'
END
FROM students
有没有更好的方法来写这个?我尝试构造一个文字数组并使用该列来索引它,但如果可能的话我还没有想出语法。
这些不能工作:
SELECT {"fr", "so", "ju", "se"}[class] FROM students
SELECT '{"fr", "so", "ju", "se"}'[class] FROM students
答案 0 :(得分:1)
您可以使用ARRAY keyword构建数组:
SELECT (ARRAY['fr', 'so', 'ju', 'se'])[class] FROM students
在PostgreSQL中,数组下标以1
开头,而不是0
,所以如果类似枚举的列使用0
作为其值之一,则可能需要将其移至get你想要什么。例如,如果class
的值为0,1,2和3,则可以向class
添加1:
SELECT (ARRAY['fr', 'so', 'ju', 'se'])[class + 1] FROM students
答案 1 :(得分:0)
将其作为CTE并进行常规加入:
with class (class, class_name) as ( values
(1, 'Freshman'),(2,'Sophomore'),(3,'Junior'),(4,'Senior')
), student (id, name, class) as (values
(1, 'Adam',1),(2,'Bruce',1),(3,'Chris',3),(4,'Dave',4)
)
select id, name, class_name
from
student
inner join
class using (class)
;
id | name | class_name
----+-------+------------
1 | Adam | Freshman
2 | Bruce | Freshman
3 | Chris | Junior
4 | Dave | Senior
https://www.postgresql.org/docs/current/static/sql-select.html#SQL-WITH
WITH子句允许您指定一个或多个子查询,这些子查询可以在主查询中按名称引用。子查询在主查询期间有效地充当临时表或视图。