运算符和函数 - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

运算符和函数

Amazon Redshift 为 SUPER 运算符和函数提供以下函数支持。

算术运算符

SUPER 值支持使用动态类型的所有基本算术运算符 +、-、*、/、%。操作的结果类型仍为 SUPER。对于所有运算符(二进制运算符 + 除外),输入操作数必须为数字。否则Amazon Redshift,返回 null。当 Amazon Redshift 运行这些运算符且动态类型不更改时,小数和浮点值之间的区别将保留。但是,当您使用乘积和除数时,小数位数会发生变化。算术溢出仍会导致查询错误,它们不会更改为 null。如果输入为数字,则二进制运算符 + 将执行加法;如果输入为字符串,则执行联接。如果一个操作数是一个字符串,另一个操作数是一个数字,则结果为空。Unary 前缀运算符 + 和 - 如果 SUPER 值不是数字,则返回 null,如以下示例所示:

SELECT (c_orders[0]. o_orderkey + 0.5) * c_orders[0]. o_orderkey / 10 AS math FROM customer_orders_lineitem; math ---------------------------- 1757958232200.1500 (1 row)

动态类型允许 SUPER 中的小数值具有不同的小数位数。 Amazon Redshift 会将其视为不同的静态类型并允许所有数学运算。 根据操作数的小数位数动态Amazon Redshift计算生成的小数位数。如果其中一个操作数是浮点数,则 会将另一个操作数Amazon Redshift提升为浮点数,并生成浮点数形式的结果。

算术函数

Amazon Redshift 对于 SUPER 列, 支持以下算术函数。如果输入不是数字,则返回 null:

以下示例使用算术函数查询数据:

SELECT x, FLOOR(x), CEIL(x), ROUND(x) FROM ( SELECT (c_orders[0]. o_orderkey + 0.5) * c_orders[0].o_orderkey / 10 AS x FROM customer_orders_lineitem ); x | floor | ceil | round --------------------+---------------+---------------+--------------- 1389636795898.0500 | 1389636795898 | 1389636795899 | 1389636795898

ABS 函数保留输入小数的小数位数,而 FLOOR、CEIL 则保留小数位数。ROUND 消除输入小数的小数位数。

数组函数

Amazon Redshift 支持以下数组构成和实用工具函数数组、array_concat、子数组、array_flatten、get_array_length 和 split_to_array。

您可以使用 ARRAY 函数(包括其他 SUPER 值)从 Amazon Redshift 数据类型中的值构造 SUPER 数组。以下示例使用 variadic 函数 ARRAY:

SELECT ARRAY(1, c.c_custkey, NULL, c.c_name, 'abc') FROM customer_orders_lineitem c; array ------------------------------------------------------- [1,8401,null,""Customer#000008401"",""abc""] [1,9452,null,""Customer#000009452"",""abc""] [1,9451,null,""Customer#000009451"",""abc""] [1,8251,null,""Customer#000008251"",""abc""] [1,5851,null,""Customer#000005851"",""abc""] (5 rows)

以下示例将数组联接与 ARRAY_CONCAT 函数结合使用:

SELECT ARRAY_CONCAT(JSON_PARSE('[10001,10002]'),JSON_PARSE('[10003,10004]')); array_concat ------------------------------------ [10001,10002,10003,10004] (1 row)

以下示例将数组操作与 SUBARRAY 函数结合使用,该函数返回输入数组的子集。

SELECT SUBARRAY(ARRAY('a', 'b', 'c', 'd', 'e', 'f'), 2, 3); subarray --------------- ["c","d","e"] (1 row))

以下示例使用 ARRAY_FLATTEN 将多个级别的数组合并到单个数组中:

SELECT x, ARRAY_FLATTEN(x) FROM (SELECT ARRAY(1, ARRAY(2, ARRAY(3, ARRAY()))) AS x); x | array_flatten ----------------+--------------- [1,[2,[3,[]]]] | [1,2,3] (1 row)

数组函数 ARRAY_CONCAT 和 ARRAY_FLATTEN 使用动态键入规则。如果输入不是数组,它们将返回 null 而不是错误。GET_ARRAY_LENGTH 函数返回给定对象或数组路径的 SUPER 数组的长度。

SELECT c_name FROM customer_orders_lineitem WHERE GET_ARRAY_LENGTH(c_orders) = ( SELECT MAX(GET_ARRAY_LENGTH(c_orders)) FROM customer_orders_lineitem );

以下示例使用 SPLIT_TO_ARRAY 将字符串拆分为字符串数组。函数使用分隔符作为可选参数。如果没有分隔符,则默认值为逗号。

SELECT SPLIT_TO_ARRAY('12|345|6789', '|'); split_to_array --------------------- ["12","345","6789"] (1 row)