SELECT 子句 - Amazon Kinesis Data Analytics

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

SELECT 子句

在 <select-clause>STREAM 关键字后面使用以下项目:

 <select-list> :=    <select-item> { , <select-item> }... <select-item> :=    <select-expression> [ [ AS ] <simple-identifier> ] <simple-identifier> :=    <identifier> | <quoted-identifier> <select-expression> :=    <identifier> . *  | *  | <expression>

表达式

这些表达式中的每一个都可能是:

  • 标量表达式

  • 如果这是聚合查询聚合函数,则调用(参见GROUP BY 子句

  • 调用 a分析函数,如果这不是聚合查询

  • 通配符表达式 * 扩展到 FROM 子句中所有关系的所有列

  • 通配符表达式别名。* 扩展到由关系命名的别名的所有列

  • 这个ROWTIME

  • aCASE 表达式

可以使用 AS column_name 语法为每个表达式分配别名。这是此查询的结果集中的名称。如果此查询位于封闭查询的 FROM 子句中,则该名称将用于引用该列。在流引用的 AS 子句中指定的列数必须与原始流中定义的列数相匹配。

Amazon Kinesis Data Analytics 有几条简单的规则来导出没有别名的表达式的别名。列表达式的默认别名是列的名称:例如,EMPS.DEPTNO 在默认情况下别名为 DEPTNO。其他表达式被赋予一个别名,如 EXPR$0。你不应该假设系统每次都会生成相同的别名。

在流式查询中,将列别名为 ROWTIME 具有特殊含义:有关更多信息,请参阅ROWTIME

注意

所有流都有一个名为 ROWTIME 的隐式列。此列可能会影响您对 SQL: 2008 现在支持的 “AS t (c1, c2,...)” 语法的使用。以前在 FROM 子句中,你只能写

SELECT ... FROM r1 AS t1 JOIN r2 as t2

但是 t1 和 t2 的列将与 r1 和 t2 的列相同。AS 语法允许您通过编写以下内容来重命名 r1 的列:

SELECT ... FROM r1 AS t1(a, b, c)

(r1 必须恰好有 3 列才能使此语法起作用)。

如果 r1 是一个流,那么 ROWTIME 会被隐式包含在内,但它不算作一列。因此,如果一个流有 3 列而不包括 ROWTIME,则无法通过指定 4 列来重命名 ROWTIME。例如,如果直播 Bids 有三列,则以下代码无效。

SELECT STREAM * FROM Bids (a, b, c, d)

重命名另一列 ROWTIME 也是无效的,如下例所示。

SELECT STREAM * FROM Bids (ROWTIME, a, b)

因为那意味着将另一列重命名为 ROWTIME。有关表达式和文量的更多信息,请参阅表达式和文字

CASE 表达式

CASE 表达式允许您为每个此类测试指定一组离散测试表达式和特定的返回值(表达式)。每个测试表达式都在 WHEN 子句中指定;每个返回值表达式都在相应的 THEN 子句中指定。可以指定多个这样的 WHEN-THEN 对。

如果您在第一个 WHEN 子句 comparison-test-expression 之前指定 a,则会将 WHEN 子句中的每个表达式与该表达式进行比较 comparison-test-expression。第一个匹配的 comparison-test-expression 会导致返回其相应的 THEN 子句的返回值。如果没有 WHEN 子句表达式与 comparison-test-expression,则除非指定了 ELSE 子句,否则返回值为空,在这种情况下,将返回该 ELSE 子句中的返回值。

如果您未在第一个 WHEN 子句 comparison-test-expression 之前指定 a,则对 WHEN 子句中的每个表达式进行评估(从左到右),第一个表达式为真会导致返回其相应 THEN 子句的返回值。如果没有 WHEN 子句表达式为真,则返回值为空,除非指定了 ELSE 子句,在这种情况下,将返回该 ELSE 子句中的返回值。

VALUES

VALUES 使用表达式来计算一个或多个行值,通常在较大的命令中使用。创建多行时,VALUES 子句必须为每行指定相同数量的元素。生成的表列数据类型源自该列中出现的表达式的显式或推断类型。只要允许 SELECT,在语法上就允许使用值。另请参阅本指南的查询主题中关于作为运算符的值的讨论。

语法

VALUES ( expression [, ...] ) [, ...]    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]

VALUES 是一个 SQL 运算符,与 SELECT 和 UNION 相当,支持以下类型的操作:

  • 你可以写入 VALUES (1)、(2) 来返回两行,每行都有一个匿名列。

  • 你可以写入值 (1, 'a'), (2, 'b') 来返回两列的两行。

  • 您可以使用 AS 命名列,如以下示例所示:

SELECT * FROM (VALUES (1, 'a'), (2, 'b')) AS t(x, y)

VALUES 最重要的用法是在 INSERT 语句中插入一行:

 INSERT INTO emps (empno, name, deptno, gender)    VALUES (107, 'Jane Costa', 22, 'F');

但是,您还可以插入多个行:

  INSERT INTO Trades (ticker, price, amount)     VALUES ('MSFT', 30.5, 1000),            ('ORCL', 20.25, 2000);

在 SELECT 语句的 FROM 子句中使用 VALUES 时,整个 VALUES 子句必须用圆括号括起来,这与它作为查询而不是表表达式运行这一事实一致。有关其他示例,请参阅 FROM 子句

注意

在直播中使用 INSERT 需要考虑一些额外的注意事项,例如行时间、泵和 INSERT EXPERCED。有关更多信息,请参阅 INSERT