Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql POSTGRES:接受hashmap或类似类型作为参数的函数_Sql_Database_Postgresql_Stored Procedures_Plpgsql - Fatal编程技术网

Sql POSTGRES:接受hashmap或类似类型作为参数的函数

Sql POSTGRES:接受hashmap或类似类型作为参数的函数,sql,database,postgresql,stored-procedures,plpgsql,Sql,Database,Postgresql,Stored Procedures,Plpgsql,有没有办法将hashmap(或类似的数据类型)作为参数传递给postgres函数 我试图得到一个函数,它可以在不同的情况下接受不同数量的参数。我不想为那些与特定调用方无关的参数传递null或0 我试图实现的示例(请原谅伪代码) 有没有办法在postgres中实现这一点?对于您的用例,您可以使用hstore或两个数组,或者2D数组。您的示例很好地演示了SQL注入,因此您不应该忘记必要的转义 CREATE OR REPLACE FUNCTION hstore_params(filters hstor

有没有办法将hashmap(或类似的数据类型)作为参数传递给postgres函数

我试图得到一个函数,它可以在不同的情况下接受不同数量的参数。我不想为那些与特定调用方无关的参数传递null或0

我试图实现的示例(请原谅伪代码)


有没有办法在postgres中实现这一点?

对于您的用例,您可以使用hstore或两个数组,或者2D数组。您的示例很好地演示了SQL注入,因此您不应该忘记必要的转义

CREATE OR REPLACE FUNCTION hstore_params(filters hstore)
RETURNS text AS $$
BEGIN
  RETURN 'SELECT * FROM some_table ' ||
            coalesce ('WHERE ' ||
            ( SELECT string_agg(quote_ident(key) || ' = ' || quote_literal(value), ' and ') 
                 FROM each('c1 => Ahoj, c2 => Nazdar'::hstore). '') );
END;
$$ LANGUAGE plpgsql;
postgres=#选择hstore_params(); 许淑仪 --------------- 好啊 (1排) postgres=#选择hstore_参数('Ahoj','Nazdar'); 许淑仪 --------------- 好啊 (1排) postgres=#选择hstore_参数('Ahoj'); 许淑仪 --------------- 好啊 (1排) postgres=#选择hstore_参数(c2:=“Ahoj”); 许淑仪 --------------- 好啊 (1排)
查看
hstore
新的JSONB也会这样做吗?@Charlie木匠 - 是的,有不同的语法,但是是的-jsonb几乎拥有所有像hstore这样的功能。太棒了!谢谢
CREATE OR REPLACE FUNCTION hstore_params(filters hstore)
RETURNS text AS $$
BEGIN
  RETURN 'SELECT * FROM some_table ' ||
            coalesce ('WHERE ' ||
            ( SELECT string_agg(quote_ident(key) || ' = ' || quote_literal(value), ' and ') 
                 FROM each('c1 => Ahoj, c2 => Nazdar'::hstore). '') );
END;
$$ LANGUAGE plpgsql;
postgres=# SELECT hstore_params('c1 => Ahoj, c2 => Nazdar'); hstore_params -------------------------------------------------------------- SELECT * FROM some_table WHERE c1 = 'Ahoj' and c2 = 'Nazdar' (1 row)
CREATE OR REPLACE FUNCTION hstore_params(c1 text DEFAULT NULL, c2 text DEFAULT NULL)
RETURNS text AS $$
BEGIN 
  EXECUTE 'SELECT * 
             FROM xx
            WHERE (c1 = $1 OR c1 IS NULL) 
              AND (c2 = $2 OR c2 IS NULL)'
    USING c1, c2;
  RETURN 'ok';
END;
$$ LANGUAGE plpgsql;
postgres=# SELECT hstore_params(); hstore_params --------------- ok (1 row) postgres=# SELECT hstore_params('Ahoj','Nazdar'); hstore_params --------------- ok (1 row) postgres=# SELECT hstore_params('Ahoj'); hstore_params --------------- ok (1 row) postgres=# SELECT hstore_params(c2 := 'Ahoj'); hstore_params --------------- ok (1 row)