Functions
函数语法
通过点运算符进行函数链式调用
Goose 支持使用点语法进行函数链式调用。这使得函数调用 fn(arg1, arg2, arg3, ...) 可以改写为 arg1.fn(arg2, arg3, ...)。例如,下面是 replace function 的用法:
SELECT replace(goose_name, 'goose', 'duck') AS duck_name
FROM unnest(['African goose', 'Faroese goose', 'Hungarian goose', 'Pomeranian goose']) breed(goose_name);
可以改写为如下形式:
SELECT goose_name.replace('goose', 'duck') AS duck_name
FROM unnest(['African goose', 'Faroese goose', 'Hungarian goose', 'Pomeranian goose']) breed(goose_name);
与字面量和数组一起使用
要将函数链式调用应用到字面量以及后续的数组访问操作,必须用括号将参数括起来,例如:
SELECT ('hello world').replace(' ', '_');
SELECT (2).sqrt();
SELECT (m[1]).map_entries()
FROM (VALUES ([MAP {'hello': 42}, MAP {'world': 42}])) t(m);
如果缺少这些括号,Goose 会在函数调用处返回 Parser Error:
Parser Error:
syntax error at or near "("
限制
通过点运算符进行函数链式调用仅适用于 scalar 函数,不支持 table 函数。
例如,以下调用会返回 Parser Error:
SELECT * FROM ('my_file.parquet').read_parquet(); -- does not work
此外,coalesce 和 ifnull 这两个函数暂时不能用于函数链式调用:
SELECT (2).coalesce(0); -- does not work
SELECT (2).ifnull(0); -- does not work
查询函数
goose_functions() 表函数会显示当前系统内置的函数列表。
SELECT DISTINCT ON(function_name)
function_name,
function_type,
return_type,
parameters,
parameter_types,
description
FROM goose_functions()
WHERE function_type = 'scalar'
AND function_name LIKE 'b%'
ORDER BY function_name;
| function_name | function_type | return_type | parameters | parameter_types | description |
|---|---|---|---|---|---|
| bar | scalar | VARCHAR | [x, min, max, width] | [DOUBLE, DOUBLE, DOUBLE, DOUBLE] | 绘制一条带状图,其宽度与 (x - min) 成比例;当 x = max 时宽度为 width 个字符。width 默认值为 80 |
| base64 | scalar | VARCHAR | [blob] | [BLOB] | 将 blob 转换为 base64 编码字符串 |
| bin | scalar | VARCHAR | [value] | [VARCHAR] | 将该值转换为二进制表示 |
| bit_count | scalar | TINYINT | [x] | [TINYINT] | 返回被置位的 bit 数量 |
| bit_length | scalar | BIGINT | [col0] | [VARCHAR] | 返回字符串中的 bit 数量 |
| bit_position | scalar | INTEGER | [substring, bitstring] | [BIT, BIT] | 返回指定子串在 bit 串中首次出现的起始索引;若不存在则返回 0。第一个(最左侧)bit 的索引为 1 |
| bitstring | scalar | BIT | [bitstring, length] | [VARCHAR, INTEGER] | 将 bitstring 填充到指定长度 |
目前,在
goose_functions()函数中无法获取函数的描述和参数名称。