Intento escribir una función para insertar algunos valores en column3 de mi tabla en función de los valores dentro de esta tabla, pero no estoy tan familiarizado con la escritura de funciones en Postgresql 9.6.
--Create some table CREATE TABLE test(column1 INT, column2 INT, column3 TEXT) INSERT INTO test VALUES(-8020,15),(-200,1),(23,115) --Build function CREATE OR REPLACE FUNCTION new_function() RETURNS TEXT AS $$ BEGIN IF test(column1) <= -7000 THEN INSERT INTO test(column3) VALUES('small'); ELSIF test(column1) >= -7000 AND test(column2) <= 15 THEN INSERT INTO test(column3) VALUES('nohello'); ELSIF test(column1) >= -7000 ANDtable(column2) >= 15 THEN INSERT INTO test(column3) VALUES('test'); ELSE INSERT INTO test(column6) VALUES("nodata"); END IF; END; $$ LANGUAGE plpgsql;El resultado debería ser una tabla que se vea así:
Column1 | Column2 | Column3 --------------------------- -8020 | 15 | small -200 | 1 | nohello 23 | 115 | test Al llamar a new_function me sale el error column1 doesn't exist.
Parece que en realidad está buscando una update (que cambia los valores en las filas existentes) en lugar de una insert (que crea nuevas filas).
Pero en resumidas cuentas, sugeriría simplemente usar una columna calculada:
create table test( column1 int, column2 int, column3 text generated always as ( case when column1 <= -7000 then 'small' when column1 <= 15 then 'nohello' else 'nodata' end ) stored );Cuando se insertan o actualizan filas en la tabla, la base de datos ajusta automáticamente la columna calculada en consecuencia, por lo que siempre está actualizada.
insert into test(column1, column2) values(-8020,15),(-200,1),(23,115); select * from test;
columna1 | columna2 | columna3
------: | ------: | :------
-8020 | 15 | pequeña
-200 | 1 | hola
23 | 115 | sin datos
Tenga en cuenta que las columnas generadas solo están disponibles a partir de Postgres 12. En versiones anteriores, una alternativa es tener solo las dos primeras columnas de la tabla y crear una vista para exponer la tercera columna:
create view myview as select column1, column2, case when column1 <= -7000 then 'small' when column1 <= 15 then 'nohello' else 'nodata' end as column3 from mytableLuego puede consultar la vista en lugar de la tabla para mostrar sus datos.
La respuesta de GMB es la solución perfecta, aunque puede actualizar la tabla usando la expresión condicional CASE como se muestra a continuación
update test set column3 = case when column1 <= - 7000 then 'small' when (column1 >= - 7000 and column2 <= 15) then 'nohello' when (column1 >= - 7000 and column2 >= 15) then 'test' else 'nodata' end;