PostgreSQL:将函数存储在列中作为值
函数可以作为匿名函数直接存储在列中作为其值吗?
假设我希望这个函数存储在列中。 示例(伪代码):
Table my_table: pk (int), my_function (func)
func ( x ) { return x * 100 }
稍后将其用作:
select
t.my_function(some_input) AS output
from
my_table as t
where t.pk = 1999
每个 pk 的函数可能有所不同。
Can functions be stored as anonymous functions directly in column as its value?
Let's say I want this function be stored in column.
Example (pseudocode):
Table my_table: pk (int), my_function (func)
func ( x ) { return x * 100 }
And later use it as:
select
t.my_function(some_input) AS output
from
my_table as t
where t.pk = 1999
Function may vary for each pk.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你的标题要求的不是你的例子。
以下是针对这两种情况的解决方案:
1. 动态计算表达式
您必须考虑到结果类型可能会有所不同。我为此使用多态类型。
相关:
调用:
SQL 是严格类型化的,相同的结果列只能有一个数据类型。对于可能具有异构数据类型的多行,您可能会选择
text
类型,因为每种数据类型都可以与text
进行转换:或者返回 multplce 列,例如:
db>>小提琴此处
2. 动态创建和使用函数
可以动态创建函数然后使用它们。但是,您无法使用普通 SQL 来做到这一点。您将必须使用另一个 函数 来执行此操作,或者至少使用一个匿名代码块(DO 语句),在 PostgreSQL 9.0 中引入。
它可以这样工作:
调用:
db<>fiddle 此处
之后您可能想删除该函数。
在大多数情况下,您应该只创建函数并完成它。如果您遇到多个版本或权限的问题,请使用单独的架构。
有关我在这里使用的功能的更多信息,请参阅我在 dba.stackexchange.com 上的相关答案。
Your title asks something else than your example.
Here are solutions for both:
1. Evaluate expressions dynamically
You have to take into account that the resulting type can vary. I use polymorphic types for that.
Related:
Call:
SQL is strictly typed, the same result column can only have one data type. For multiple rows with possibly heterogeneous data types, you might settle for type
text
, as every data type can be cast to and fromtext
:Or return multplce columns like:
db<>fiddle here
2. Create and use functions dynamically
It is possible to create functions dynamically and then use them. You cannot do that with plain SQL, however. You will have to use another function to do that or at least an anonymous code block (DO statement), introduced in PostgreSQL 9.0.
It can work like this:
Call:
db<>fiddle here
You may want to drop the function afterwards.
In most cases you should just create the functions instead and be done with it. Use separate schemas if you have problems with multiple versions or privileges.
For more information on the features I used here, see my related answer on dba.stackexchange.com.