Tengo una mesa:

Table_Name: price_list
---------------------------------------------------
| id | price_type_a | price_type_b | price_type_c |
---------------------------------------------------
| 1  |    1234      |     5678     |     9012     |
| 2  |    3456      |     7890     |     1234     |
| 3  |    5678      |     9012     |     3456     |
---------------------------------------------------

Necesito una consulta de selección en Postgres que da un resultado como este:

---------------------------
| id | price_type | price |
---------------------------
| 1  |  type_a    | 1234  |
| 1  |  type_b    | 5678  |
| 1  |  type_c    | 9012  |
| 2  |  type_a    | 3456  |
| 2  |  type_b    | 7890  |
| 2  |  type_c    | 1234  |
...

Cualquier ayuda con enlaces a ejemplos similares es muy apreciada.

5
skybunk 2 nov. 2017 a las 16:54

2 respuestas

La mejor respuesta

Una sola SELECT con una combinación LATERAL a una expresión VALUES hace el trabajo:

SELECT p.id, v.*
FROM   price_list p
     , LATERAL (
   VALUES
      ('type_a', p.price_type_a)
    , ('type_b', p.price_type_b)
    , ('type_c', p.price_type_c)
   ) v (price_type, price);

Relacionado:

9
Erwin Brandstetter 3 jul. 2019 a las 21:38

Prueba algo como:

select id, 'type_a',type_a  from price_list
union all
select id, 'type_b',type_b  from price_list
union all
select id, 'type_c',type_c  from price_list
;

actualizar como sugiere a_horse_with_no_name, la unión es una forma de seleccionar los valores de DISTINCT, porque aquí se preferiría UNION ALL, por si acaso (no sé si la identificación es ÚNICA)

Por supuesto, si es Reino Unido, no habrá diferencia.

0
Vao Tsun 2 nov. 2017 a las 14:19