我需要执行复杂但相当一致的公式。
在大型表上执行UDF时,速度慢得令人难以置信,因此我宁愿避免使用它们(在大型表上,SELECT子句中使用UDF的执行时间比使用等效的内联语句慢30-100倍)
我可以写内联公式代替,但是结果代码太大,难以读,而且更难维护。
是否有一种方法来设计像C或SAS宏这样的东西,它只是在查询中做直接的文本替换?
我想要像下面这样的东西
给定:
isKeyValid(key, param1, param2)
生成的代码:(这只是我在飞行中随机写的废话-它应该支持任何数量的原始SQL)
case
when param1 in ('a','b','c') and substr(param2,1,2) = '53' and key=param1||param2 then 1
when param1 in ('a','d','e') and substr(param2,1,2) = '51' and key=param1||param2 then 1
else 0
end
我从未见过任何udf在I…
你使用的是哪个版本和发行版?假设是当前版本(v7.2或更高版本),请查看2016年对UDF内联的增强,以确保您的代码可以内联。
用户定义表函数(udtf)的内联支持
改进的SQL标量用户定义函数(udf)的内联支持
内联函数:当SQL标量函数被内联时,而不是调用函数作为查询的一部分,RETURN中的表达式函数的语句可以被复制(内联)到查询中本身。这样的函数称为内联函数。一个标量如果:
- SQL函数是全局确定性的
- SQL-routine-body只包含一个RETURN语句。
- 没有输入参数是数组类型
- 结果的数据类型不是XML或数组类型。
- 函数中引用的所有对象在创建函数时都存在。
- SQL-routine-body不包含引用输入参数的公共表表达式。
- SQL-routine-body不包含没有前面引用输入的LATERAL关键字的嵌套表表达式参数。
内联函数只有在下列情况下才会被复制(内联)到查询中:
- 查询符合SQL查询引擎(SQE)的条件。
- 函数引用一个对象,并且函数的权限属性和查询的权限属性基于以下条件:
- 函数定义在用户权限(* user)下运行。
- 查询在所有者权限下运行(* owner),查询的所有者与函数的所有者相同。
- 查询在用户权限(* user)下运行,该用户或该用户所属组的配置文件与配置文件的所有者相同函数。
注意:如果函数定义为FENCED,则查询不能使用采用权威。如果查询在所有者的权限下运行(*OWNER)和函数在用户权限(* user)下运行,则查询的所有者必须与用户或用户组相同概要。
特别要注意强调的要求,即函数只包含一个RETURN
。如果你有一个使用BEGIN
和END
的复合语句;你的函数不会被内联。