集值映射(set -valued mapping)

Set-valued function

 

由以上,x小于1/2,则F(x) 取值为(x+1/2)和(1/2-x),如图。比如,x=1/4,则F(x)有两个取值,即3/4和1/4。因而,F(x)是 a set-valued map or multivalued map or point to-set map or multifunction。注意这里F(x)是多值映射,但不是连续的。

集值映射数学符号记为X\rightarrow2^X.


 

在 PostgreSQL 中,当尝试在不允许返回多值(合)的上下文中调用返回合的函数时,会出现 `set-valued function called in context that cannot accept a set` 错误。这种错误通常出现在使用 `SELECT` 语句中调用返回合的函数时,而没有正确地处理合的展开。 ### 错误原因 1. **函数返回类型为 `SETOF`**:如果函数定义为返回 `SETOF some_type`,则表示该函数可以返回多行数据。当在 `SELECT` 语句中直接调用该函数而不使用 `LATERAL` 或 `UNNEST` 等机制时,PostgreSQL 无法处理这种合类型的返回值。 2. **错误的调用方式**:在某些情况下,用户可能直接在 `SELECT` 子句中调用返回合的函数,而没有使用适当的语法来处理合。例如: ```sql SELECT my_set_returning_function(); ``` 这种写法会导致错误,因为 `SELECT` 语句期望每个表达式返回单个值,而不是一个合。 ### 解决方法 1. **使用 `LATERAL` 关键字**:`LATERAL` 允许在 `FROM` 子句中调用返回合的函数,并将其结果与其他表进行连接。例如: ```sql SELECT * FROM some_table t, LATERAL my_set_returning_function(t.id); ``` 这种方式允许函数根据 `some_table` 中的每一行生成一个结果,并将其与原始表的行进行关联[^3]。 2. **使用 `UNNEST` 函数**:如果函数返回的是数组类型,可以使用 `UNNEST` 将其展开为多行。例如: ```sql SELECT UNNEST(my_array_returning_function()); ``` 这样可以将数组中的每个元素转换为单独的行。 3. **确保函数返回正确的类型**:如果不需要返回合,可以修改函数的返回类型为单个值类型,而不是 `SETOF`。例如,将 `RETURNS SETOF integer` 改为 `RETURNS integer`,并确保函数内部只返回单个值。 4. **使用 `RETURN QUERY` 正确处理合返回**:在 PL/pgSQL 中,如果存储过程返回 `SETOF sometype`,则返回值必须在 `RETURN NEXT` 或 `RETURN QUERY` 中声明,然后有一个不带参数的 `RETURN` 命令,告诉函数执行完毕。例如: ```sql CREATE OR REPLACE FUNCTION my_function() RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT id FROM some_table; RETURN; END; $$ LANGUAGE plpgsql; ``` ### 示例代码 假设有一个函数 `generate_series`,它返回一个整数序列: ```sql CREATE OR REPLACE FUNCTION generate_series(start integer, stop integer) RETURNS SETOF integer AS $$ BEGIN RETURN QUERY SELECT generate_series(start, stop); END; $$ LANGUAGE plpgsql; ``` 如果直接调用该函数,会引发错误: ```sql SELECT generate_series(1, 5); -- 错误: set-valued function called in context that cannot accept a set ``` 可以通过以下方式正确调用: ```sql SELECT * FROM generate_series(1, 5); -- 或者 SELECT UNNEST(ARRAY(SELECT generate_series(1, 5))); ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值