函数 returns 行类型作为单个值而不是每个字段一个值

Function returns row type as single value instead of one value per field

我唯一一次在 SO 上遇到类似问题是在 here,但建议的解决方案与我无关。

我调用了一个 PostgreSQL 函数,但它 return 是单个值,而不是我可以访问的每个字段一个值。我有一个table"Words",它由一个主键word和其他字段组成。

这是函数:

CREATE OR REPLACE FUNCTION equal(s TEXT) 
RETURNS "Word" AS $$
    SELECT *
    FROM "Word"
    WHERE word = s;
$$ 
LANGUAGE sql;

这是函数调用(使用 SQLAlchemy):

result = db.session.query(func.equal("is")).first() 

输出将是:'(is, ... )' 而不是所需的输出:('is', ...).

如何调整函数,使其 return 改为元组?

跟进问题

按照建议,db.session.execute(f"SELECT * FROM equal('{w}');").first() 可以解决问题。不幸的是,如果没有找到结果,它 return 是 None 的列表。我希望它改为 return None。我原来方法中的 query 对象执行此操作,但 return 输出为字符串。

调整函数调用,而不是函数

要分解 returned(复合)行类型并获取单独的列,请调用函数:

SELECT * FROM equal('is');

而不是:

<strike>SELECT equal('is');</strike>

参见:

  • Simple PostgreSQL function to return rows

为了return什么都没有,而不是在没有找到行的时候用一行NULL值,让它成为一个set-returning函数:

CREATE OR REPLACE FUNCTION equal(_s text) 
  RETURNS SETOF "Word"  -- !
  LANGUAGE sql AS
$$
   SELECT *
   FROM   "Word"
   WHERE   word = _s;
$$;

db<>fiddle here

同样的调用。

The manual:

The SETOF modifier indicates that the function will return a set of items, rather than a single item.

所以它也可以return一个集,即什么都没有。