¿PostgreSQL admite columnas calculadas / calculadas, como MS SQL Server? No puedo encontrar nada en los documentos, pero como esta función está incluida en muchos otros DBMS, pensé que podría estar perdiendo algo.
Por ejemplo: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
fuente
fuente
Respuestas:
Las columnas generadas hasta Postgres 11 no son compatibles, como se define en el estándar SQL e implementado por algunos RDBMS, incluidos DB2, MySQL y Oracle. Ni las similares "columnas calculadas" de SQL Server.
STORED
Las columnas generadas se introducen con Postgres 12 . Ejemplo trivial:db <> violín aquí
VIRTUAL
las columnas generadas pueden venir con una de las siguientes iteraciones. (Todavía no en Postgres 13).Relacionado:
Hasta entonces , puede emular
VIRTUAL
columnas generadas con una función usando la notación de atributo (tbl.col
) que se ve y funciona de manera muy similar a una columna generada virtual . Esa es una rareza de sintaxis que existe en Postgres por razones históricas y que encaja en el caso. Esta respuesta relacionada tiene ejemplos de código :Sin
SELECT * FROM tbl
embargo, la expresión (que parece una columna) no se incluye en un . Siempre debes enumerarlo explícitamente.También se puede admitir con un índice de expresión coincidente , siempre que la función sea
IMMUTABLE
. Me gusta:Alternativas
Alternativamente, puede implementar una funcionalidad similar con a
VIEW
, opcionalmente junto con índices de expresión. LuegoSELECT *
puede incluir la columna generada.Las
STORED
columnas calculadas "persistentes" ( ) se pueden implementar con disparadores de una manera funcionalmente idéntica.Las vistas materializadas son un concepto estrechamente relacionado, implementado desde Postgres 9.3 .
En versiones anteriores, se pueden administrar MV manualmente.
fuente
¡¡Sí tu puedes!! La solución debe ser fácil, segura y eficaz ...
Soy nuevo en postgresql, pero parece que puede crear columnas calculadas usando un índice de expresión , emparejado con una vista (la vista es opcional, pero hace la vida un poco más fácil).
Supongamos que mi cálculo es
md5(some_string_field)
, luego creo el índice como:Ahora, cualquier consulta que actúe
MD5(some_string_field)
utilizará el índice en lugar de calcularlo desde cero. Por ejemplo:Puedes comprobar esto con explicar .
Sin embargo, en este punto, confía en que los usuarios de la tabla sepan exactamente cómo construir la columna. Para hacer la vida más fácil, puede crear una
VIEW
versión aumentada de la tabla original, agregando el valor calculado como una nueva columna:Ahora, cualquier consulta que utilice
some_table_augmented
podrá utilizarsesome_string_field_md5
sin preocuparse por cómo funciona ... simplemente obtienen un buen rendimiento. La vista no copia ningún dato de la tabla original, por lo que es buena tanto en cuanto a memoria como a rendimiento. Sin embargo, tenga en cuenta que no puede actualizar / insertar en una vista, solo en la tabla de origen, pero si realmente lo desea, creo que puede redirigir las inserciones y actualizaciones a la tabla de origen utilizando reglas (podría estar equivocado en ese último punto ya que Yo nunca lo he probado).Editar: parece que si la consulta involucra índices en competencia, el motor del planificador a veces puede no usar el índice de expresión en absoluto. La elección parece depender de los datos.
fuente
if the query involves competing indices
?¡Una forma de hacer esto es con un gatillo!
El disparador se activa antes de que se actualice o inserte la fila. Cambia el campo que queremos calcular de
NEW
registro y luego devuelve ese registro.fuente
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
y acaba de regresar: 1 2 y 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
el valor de latwo
columna se calculará automáticamente!PostgreSQL 12 admite columnas generadas:
db <> demostración de violín
fuente
Bueno, no estoy seguro de si esto es lo que quiere decir, pero Posgres normalmente admite la sintaxis ETL "ficticia". Creé una columna vacía en la tabla y luego necesitaba llenarla con registros calculados según los valores en la fila.
fuente
Tengo un código que funciona y uso el término calculado, no estoy en postgresSQL puro aunque ejecutamos en PADB
así es como se usa
fuente
Una solución ligera con restricción de comprobación:
fuente
field as 1 persisted
.