函数 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 SETOF
modifier indicates that the function will return a set of items, rather than a single item.
所以它也可以return一个空集,即什么都没有。
我唯一一次在 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
SETOF
modifier indicates that the function will return a set of items, rather than a single item.
所以它也可以return一个空集,即什么都没有。