我可以在SELECT语句中索引到数组文字吗?

时间:2017-02-09 20:50:52

标签: arrays postgresql select

我正在从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

2 个答案:

答案 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子句允许您指定一个或多个子查询,这些子查询可以在主查询中按名称引用。子查询在主查询期间有效地充当临时表或视图。