插入“如果不存在”,选择“如果存在”

时间:2019-07-03 14:52:14

标签: postgresql function

在Postgresql函数的工作原理上遇到了一些误解。任务是检查我的数据库中是否已经存在某些id。如果是这样-从现有记录返回一些数据。如果没有,请插入一些数据并返回所有内容。

CREATE OR REPLACE FUNCTION test(_id varchar, _data varchar[]) RETURNS varchar[] AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM my_table WHERE id = _id) THEN
        SELECT * FROM my_table WHERE id = _id;
    ELSE
        INSERT INTO my_table (id, filename, size) VALUES (_data) RETURNING *;
    END IF;
END
$$ LANGUAGE plpgsql;

选择返回错误:ERROR: invalid input syntax for integer: "id123"

SELECT test('id123', ARRAY['id123', 'filename', 123456]);

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

将各个表列的多个参数作为数组元素传递不是一个好主意。您最好使用Composite Type作为参数。这可以帮助您甚至将多行数据传递给函数,如this示例所示

如果您坚持使用数组元素,那么不能简单地在@GetMapping("/getimage/{path}") public void adminDownloadProductPicture(@PathVariable("path") String path, HttpServletResponse response) throws IOException { File file = new File(this.uploadingDir + path); // or you can use Paths.get(this.uploadingDir + path); instead Files.copy(file.toPath(), response.getOutputStream()); response.setContentType("image/jpeg"); // your content type here } 中使用它们,必须使用索引对其进行引用

VALUES()

INSERT INTO my_table (id, filename, size) VALUES (_data[1],_data[2],_data[3]::int ); 的另一个问题是它不是从函数返回的。它只是返回查询结果。如果您纯粹是想使用RETURNING *;,则可以使用with子句。

假设表的定义是这样的,

RETURNING

您可以将函数的返回类型写为 Table "public.my_table" Column | Type | Collation | Nullable | Default ----------+-------------------+-----------+----------+--------- id | character varying | | | filename | text | | | size | integer | | |

TABLE