代码之家  ›  专栏  ›  技术社区  ›  Tristan Warner-Smith

Postgres整数数组作为参数?

  •  29
  • Tristan Warner-Smith  · 技术社区  · 15 年前

    我知道,在PostgresPure中,可以将整数数组传递给函数,但在.NET数据提供程序npgsql中不支持这一点。

    我目前有一个dbcommand,我在其中加载对存储过程的调用,添加一个参数,然后执行scalar以获取用于填充对象的ID。

    现在需要取n个整数作为参数。这些用于创建子记录,将新创建的记录通过其ID链接到整数参数。

    理想情况下,我不需要对每个整数的dbcommand进行多个executeNonQuery调用,因此我将构建一个csv字符串作为参数,该参数将在数据库端进行拆分。

    我通常生活在Linq2 SQL中,享受着数据库抽象,用手动数据访问的方式来处理这个项目,这一切都变得有点脏,人们通常如何将这些类型的参数传递到Postgres中?

    3 回复  |  直到 11 年前
        1
  •  47
  •   vladr    12 年前

    见: http://www.postgresql.org/docs/9.1/static/arrays.html

    如果非本机驱动程序仍不允许传递数组,则可以:

    • 传递数组的字符串表示形式(然后存储过程可以将其解析为数组--请参见 string_to_array )

      CREATE FUNCTION my_method(TEXT) RETURNS VOID AS $$ 
      DECLARE
             ids INT[];
      BEGIN
             ids = string_to_array($1,',');
             ...
      END $$ LANGUAGE plpgsql;
      

      然后

      SELECT my_method(:1)
      

      用:1 = '1,2,3,4'

    • 依靠Postgres本身将字符串强制转换为数组

      CREATE FUNCTION my_method(INT[]) RETURNS VOID AS $$ 
             ...
      END $$ LANGUAGE plpgsql;
      

      然后

      SELECT my_method('{1,2,3,4}')
      
    • 选择不使用绑定变量,而是发出一个显式的命令字符串,并将所有参数拼写出来(确保验证或转义来自外部的所有参数,以避免SQL注入攻击)。

      create函数my_method(int[])返回void as$$
      …
      结束$$language plpgsql;
      

      然后

      SELECT my_method(ARRAY [1,2,3,4])
      
        2
  •  46
  •   brichins    13 年前

    我意识到这是一个老问题,但我花了好几个小时才找到一个好的解决方案,并认为我会把学到的东西传下去。 here 把麻烦留给别人。例如,尝试一下,

    SELECT * FROM some_table WHERE id_column = ANY(@id_list)
    

    其中@id_list通过以下方式绑定到int[]参数

    command.Parameters.Add("@id_list", NpgsqlDbType.Array | NpgsqlDbType.Integer).Value = my_id_list;
    

    其中command是npgsql command(在Visual Studio中使用c和npgsql)。

        3
  •  1
  •   user2738265    11 年前

    你可以 总是 使用格式正确的字符串。诀窍是格式化。

    command.Parameters.Add("@array_parameter", string.Format("{{{0}}}", string.Join(",", array));

    请注意,如果数组是字符串数组,则需要使用array.select(value=>string.format(“\”0 \“,value))或等效项。我在PostgreSQL中对枚举类型的数组使用这种样式,因为该数组没有自动转换。

    在我的示例中,我的枚举类型具有一些值,如“value1”、“value2”、“value3”,而我的C枚举具有匹配的值。在我的例子中,最终的SQL查询最终会查找类似(e'“value1”、“value2”')的内容,这是可行的。