Informix IDS 12.x中如何将关联表字段值作为自定义函数的入参
解决方案
方案1:使用LATERAL关键字(推荐,适用于IDS 12.10.xC10及更高版本)
这是官方提供的专门用于解决关联表字段传入表函数场景的语法,无需修改你现有的函数逻辑,仅需在原查询的table()表达式前添加LATERAL关键字即可:
select * from tab1 join lateral table( function myfunc( tab1.c1 ) ) as myfunctab2( c2 ) on myfunctab2.c2 = tab1.c2;
LATERAL会改变查询执行顺序,让右侧的表函数针对左表tab1的每一行单独计算,因此可以正常拿到对应行的c1字段值作为入参。
方案2:使用APPLY语法(兼容12.10.xC10以下的12.x版本)
如果你的数据库版本不支持LATERAL,可以使用Informix支持的CROSS APPLY语法,效果和带LATERAL的内连接完全一致:
select * from tab1 cross apply table( function myfunc( tab1.c1 ) ) as myfunctab2( c2 ) where myfunctab2.c2 = tab1.c2;
如果需要保留tab1中没有匹配函数结果的行,可以把CROSS APPLY换成OUTER APPLY。
极低版本兼容方案(无LATERAL/APPLY支持时使用)
如果你的版本连APPLY语法都不支持,可以通过存储过程逐行处理实现需求:
- 创建临时表存储结果
- 定义游标遍历
tab1的每一行,取c1值调用myfunc,将返回结果插入临时表 - 最后查询临时表得到所需结果
该方案性能较差,仅适合数据量较小的场景。
内容的提问来源于stack exchange,提问作者Herwig
相关产品推荐
相关产品推荐

