2017-02-09 6 views
0

Я читаю из базы данных PostgreSQL (которую я не контролирую), которая включает целочисленный столбец, который действует как перечисление, но значения перечисления не находятся в базе данных.Можно ли индексировать в литерал массива в инструкции SELECT?

Это не мои фактические данные, но рассмотрит пример 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

'SELECT ('{fr, so, ju, se}' :: text []) [class] FROM students', если вы хотите использовать строчную константу вместо конструктора массива. – Abelisto

ответ

0

Вы можете сделать это с помощью ARRAY keyword построить массив:

SELECT (ARRAY['fr', 'so', 'ju', 'se'])[class] FROM students 

В PostgreSQL индексы массивов начинаются с 1, не 0, так что если в столбце, подобном перечислению, используется 0 в качестве одного из его значений, вам может потребоваться изменить его, чтобы получить то, что вы хотите. Например, если значения для class были 0, 1, 2, и 3, вы можете добавить 1 к class:

SELECT (ARRAY['fr', 'so', 'ju', 'se'])[class + 1] FROM students 
1

Сделать это КТР и сделать обычный присоединиться:

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 позволяет указать один или несколько подзапросов, на которые можно ссылаться по имени в основном запросе. Подзапросы эффективно действуют как временные таблицы или представления на время первичного запроса.