0

至于规范,它是PostgreSQL 9.2,数据库通过PgAdmin3,表格格式为shapefile。如果有任何必要的额外细节,我将编辑并提供。

我本质上想根据其他一些列中的字符串值是否为空来更新一列整数值中的整数值。我最终想移植我的存储函数以使用 jdbc 在 java 应用程序中执行,但我首先想在 pgadmin3 中测试我的函数。我对 postgresql 的经验很少,并且对语法有点模糊。

因此,到目前为止,我对需要和要输入的参数有一定的了解:name、argmode、argname、argtype、column_name 和 lang_name。

我知道,如果我不返回任何东西,我可以将 RETURNS void 包含为 $$ 或根本不包含 return 语句。我认为我不需要结果集,我只想替换列中的整数值。我不确定如何引用我需要的表才能传递我要处理的列。

这是我到目前为止拼凑的代码:

CREATE [OR REPLACE] FUNCTION handle_malformed([[VARIADIC][]
table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name, table_name.column_name])

BEGIN
LOOP
IF NAME_1 IS NULL THEN 
IF LEVEL_DEPT != 0 THEN
    UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 0;
ELSE IF NAME_2 IS NULL THEN 
    IF LEVEL_DEPT != 1 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1;
ELSE IF NAME_3 IS NULL THEN 
    IF LEVEL_DEPT != 2 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 2;
ELSE IF NAME_4 IS NULL THEN 
    IF LEVEL_DEPT != 3 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 3;
ELSE IF NAME_5 IS NULL THEN 
    IF LEVEL_DEPT != 4 THEN
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 4;
ELSE
    IF LEVEL_DEPT !=5 THEN 
        UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 5;
EXCEPTION 
END LOOP;
END PROCEDURE;
$$ LANGUAGE plpgsql;

update handle_malformed(AdminBoundaries.NAME_5, AdminBoundaries.NAME_4, AdminBoundaries.NAME_3, 
AdminBoundaries.NAME_2, AdminBoundaries.NAME_1, AdminBoundaries.NAME_0, AdminBoundaries.WIKI_URL, AdminBoundaries.LEVEL_DEPT)

我放入的逻辑是我放入循环和结束循环之间的逻辑是我想要完成的逻辑。

我的具体问题是,如何在 SQL 中使用参数中的列名?

4

1 回答 1

3

根据评论,我编辑了问题以包含一个问题....据我了解,您希望在查询中使用参数中的值。为此,请使用 EXECUTE 并将查询组合为字符串。请注意,您不能参数化此类标识符,因此您必须将它们连接起来,并用于quote_ident()防止 in-stored-proc sql 注入。

所以而不是:

 UPDATE AdminBoundaries SET \"LEVEL_DEPT\" = 1;

利用:

 EXECUTE $e$ UPDATE AdminBoundaries SET $e$ || quote_ident(LEVEL_DEPT) || $e$ = 1 $e$;

您也可以使用 execute 来处理动态检查:

 EXECUTE INTO my_bool $e$ SELECT a.$e$ || quote_ident(level_dept) $e$ is not null $e$;

我认为这可以根据评论回答您的问题。如果没有,请随时澄清。

于 2013-04-19T08:53:25.700 回答