【问题标题】:How to filter a PostgreSQL table by passing an array of strings in the function如何通过在函数中传递字符串数组来过滤 PostgreSQL 表
【发布时间】:2023-01-27 19:28:41
【问题描述】:

我想传递一个像[group1, group2, group3] 这样的数组,然后过滤Postgres 表列groups

创建或替换函数 funname(groups text[]) 选择 * 来自表名 其中 groupscolumn @> groups

也请编写相同的函数,在定义character varying []时出错。

【问题讨论】:

  • 最好展示到目前为止您尝试过的内容以及出了什么问题,遇到了什么错误。另外,请澄清你的第二段:你的意思是除了一个在获取character varying[]类型(而不是text?)时抛出错误的函数之外,你还需要普通的sql查询,或者你得到一个错误当您尝试定义接受或返回此数据类型的函数时。如果您显示示例和错误消息,解决这个问题会更容易。

标签: java postgresql


【解决方案1】:

我不清楚你想要什么,但也许你正在寻找 ANY 运营商?

select * 
from some_unknown_table
where group_column = any(array_parameter);

这要求 group_column 的数据类型与参数之一匹配。例如。如果group_columntextvarchar,则参数需要声明为text[]。如果 group_column 是例如一个integer,参数需要声明为integer[]

【讨论】:

    【解决方案2】:

    您可以使用 unnest 函数转换 'table' 输出中的数组,然后过滤您需要的值,例如:

    SELECT * FROM (
    SELECT unnest (ARRAY['group1','group2','group3']) AS arr
    ) AS sub WHERE arr ='group3'
    

    【讨论】:

      【解决方案3】:

      您可以使用 join 组数组和 SELECT WHERE group IN groups 过滤器:

      import psycopg2
      
      
      def filter_groups(group_names):
      
      
      try:
          # connect to BD
          connection = psycopg2.connect(
              host="host",
              user="user",
              password="pass",
              database="db_name"
          )
      except Exception as _ex:
          print("[INFO] Connection error", _ex)
      try:
          with connection.cursor() as cursor:
              placeholders = ','.join(['%s'] * len(group_names))
              rsql = f"SELECT * FROM table_name WHERE groups IN ({placeholders})"
              cursor.execute(rsql, group_names)
              rows = cursor.fetchall()
              cursor.close()
      except Exception as _ex:
          print("[INFO] Error while working with PostgreSQL", _ex)
      
      if connection:
          connection.close()
          print("[INFO] PostgreSQL connection closed.")
      return rows
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-10
        • 2022-11-16
        • 2022-07-04
        • 1970-01-01
        • 2019-05-02
        • 1970-01-01
        • 2014-09-23
        • 2016-10-26
        相关资源
        最近更新 更多