创建函数
适用于:砖的SQLDatabricks运行时9.1及以上版本
创建一个SQL标量函数或表函数,该函数接受一组参数并返回一个标量值或一组行。
语法
创建[或取代][临时]函数[如果不存在]function_name([function_parameter(,...]])返回{data_type|表格(column_spec(,...])[特征[...]]返回{表达式|查询}function_parameterparameter_namedata_type[默认的default_expression][评论parameter_comment]column_speccolumn_namedata_type[评论column_comment]特征{语言SQL|[不]确定的|评论function_comment|[包含SQL|读取SQL数据]|SQL安全定义者}
参数
或替换
如果指定,则替换具有相同名称和签名(参数数量和参数类型)的函数。不能使用不同的签名替换现有的函数。这主要用于更新函数体和函数的返回类型。不能指定此参数
如果不存在
.临时
正在创建的函数的范围。当你指定
临时
,则创建的函数在当前会话中有效且可见。目录中没有持久化条目。如果不存在
如果指定,则仅在函数不存在时创建该函数。如果指定的函数已经存在于系统中,则函数创建成功(没有抛出错误)。不能指定此参数
或取代
.函数的名称。对于永久函数,可以选择使用模式名限定函数名。如果名称没有限定,则在当前模式中创建永久函数。
function_parameter
指定函数的参数。
参数名在函数中必须是唯一的。
任何支持的数据类型。
适用于:砖的SQLDatabricks运行时10.4及以上
当函数调用不为形参赋值时使用的可选默认值。
default_expression
必须可塑的来data_type
.表达式不能引用另一个参数或包含子查询。当为一个参数指定默认值时,以下所有参数也必须具有默认值。
评论发表评论
参数的可选描述。
评论
必须是STRING字面值。
标量函数的返回数据类型。
返回表(column_spec[,…])
表函数结果的签名。
列名在签名中必须唯一。
任何支持的数据类型。
评论column_comment
列的可选描述。
评论
必须是STRING字面值。
函数体。对于标量函数,它可以是查询或表达式。对于表函数,它只能是一个查询。表达式不能包含:
在函数体中,可以通过形参的非限定名称引用形参,也可以使用函数名限定形参。
特征
所有特征子句都是可选的。可以按任意顺序指定任意数量的子句,但每个子句只能指定一次。
语言SQL
函数的语言。SQL是唯一受支持的语言。
(不)确定的
函数是否确定。当一个函数对于一组给定的参数只返回一个结果时,它就是确定的。
评论function_comment
函数的注释。
function_comment
必须是字符串字面量。包含SQL或读取SQL数据
函数是直接还是间接地从表或视图读取数据。当函数读取SQL数据时,不能指定
包含SQL
.如果两个子句都不指定,则该属性将从函数体派生。SQL安全定义器
函数体和任何默认表达式都使用函数所有者的授权执行。这是唯一受支持的行为。
例子
创建并使用SQL标量函数
>创建视图t(c1,c2)作为值(0,1),(1,2);
——创建一个不带参数的临时函数。>创建临时函数你好()返回字符串返回“Hello World !”;>选择你好();你好世界!——创建带参数的永久函数。>创建函数区域(x双,y双)返回双返回x*y;在查询的SELECT子句中使用SQL函数。>选择区域(c1,c2)作为区域从t;0.02.0在查询的WHERE子句中使用SQL函数。>选择*从t在哪里区域(c1,c2)>0;12编写SQL函数。>创建函数广场(x双)返回双返回区域(x,x);>选择c1,广场(c1)作为广场从t;00.011.0——创建一个非确定性函数>创建函数roll_dice()返回INT不确定的包含SQL评论“掷一个六面骰子”返回(兰德()*6)::INT+1;——掷一个6面骰子>选择roll_dice();3.
创建并使用使用默认值的函数
——扩展功能,支持可变边数和骰子。——使用默认值来支持可变数量的参数>下降函数roll_dice;>创建函数roll_dice(num_diceINT默认的1评论掷骰子的个数(默认值:1),num_sidesINT默认的6评论每个骰子的边数(默认值:6))返回INT不确定的包含SQL评论“掷一些n面骰子”返回总(序列(1,roll_dice.num_dice,1),0,(acc,x)->(兰德()*roll_dice.num_sides)::int,acc->acc+roll_dice.num_dice);投掷单个6面骰子仍然有效>选择roll_dice();3.掷3个六面骰子>选择roll_dice(3.);15——掷3个10面骰子>选择roll_dice(3.,10)21——创建带有标量子查询的SQL函数。>创建视图分数(球员,分数)作为值(0,1),(0,2),(1,2),(1,5);>创建函数avg_score(pINT)返回浮动评论“获得玩家的平均分”返回选择AVG(分数)从分数在哪里球员=p;>选择c1,avg_score(c1)从t;01.513..5
创建一个SQL表函数
——制作两个日期之间的所有工作日>创建函数工作日(开始日期,结束日期)返回表格(day_of_week字符串,一天日期)返回选择提取(DAYOFWEEK_ISO从一天),一天从(选择序列(工作日.开始,工作日.结束))作为T(天)横向视图爆炸(天)作为一天在哪里提取(DAYOFWEEK_ISO从一天)之间的1和5;——返回所有工作日>选择工作日.day_of_week,一天从工作日(日期“2022-01-01”,日期“2022-01-14”);12022-01-0322022-01-043.2022-01-0542022-01-0652022-01-0712022-01-1022022-01-113.2022-01-1242022-01-1352022-01-14—返回来自LATERAL相关性的日期范围的工作日>选择工作日.*从值(日期“2020-01-01”),(日期“2021-01-01”),(日期“2022-01-01”)作为开始(开始),横向工作日(开始,开始+时间间隔“7”天);3.2020-01-0142020-01-0252020-01-0312020-01-0622020-01-073.2020-01-0852021-01-0112021-01-0422021-01-053.2021-01-0642021-01-0752021-01-0812022-01-0322022-01-043.2022-01-0542022-01-0652022-01-07
替换SQL函数
—替换一个SQL标量函数。>创建或取代函数广场(x双)返回双返回x*x;替换一个SQL表函数。>创建或取代函数getemps(deptnoINT)返回表格(的名字字符串)返回选择的名字从员工e在哪里e.deptno=getemps.deptno;描述一个SQL表函数。>描述函数getemps;函数:默认的.getemps类型:表格输入:deptnoINT返回:idINT的名字字符串
请注意
不能使用不同的签名替换现有的函数。
描述一个SQL函数
>描述函数你好;函数:你好类型:标量输入:()返回:字符串>描述函数区域;函数:默认的.区域类型:标量输入:x双y双返回:双>描述函数roll_dice;函数:默认的.roll_dice类型:标量输入:num_diceINTnum_sidesINT返回:INT>描述函数扩展roll_dice;函数:默认的.roll_dice类型:标量输入:num_diceINT默认的1掷骰子的个数(默认值:1)num_sidesINT默认的6每个骰子的面数(默认值:6)返回:INT评论:卷一个数量的米-站骰子确定的:假数据访问:包含SQL配置:...老板:的.房子@总是.赢了创建时间:坐2月1209:29:02太平洋标准时间2022身体:总(序列(1,roll_dice.num_dice,1),0,(acc,x)->(兰德()*roll_dice.num_sides)::int,acc->acc+roll_dice.num_dice)