SELECT 子句 - Amazon Kinesis Data Analytics
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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 子句)

  • 分析函数 的调用 (如果这不是一个聚合查询)

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

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

  • 屏幕 ROWTIME

  • a CASE 表达式

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

Amazon Kinesis Data Analytics 有一些用于为没有别名的表达式派生别名的简单规则。列表达式的默认别名是列的名称。例如,在默认情况下,EMPS.DEPTNO 的别名为 DEPTNO。其他表达式将被指定 EXPR$0 之类的别名。您不应假定系统每次都会生成相同的别名。

在流式查询中,为列 AS 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,但 r1 不会作为列计入。因此,如果流有 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 子句之前指定了一个比较测试表达式,则 WHEN 子句中的每个表达式都将与该比较测试表达式进行比较。第一个与比较测试表达式匹配的表达式将导致返回其对应的 THEN 子句中的返回值。如果没有 WHEN 子句表达式与比较测试表达式匹配,则返回值为 null,除非指定了 ELSE 子句,在这种情况下,将返回该 ELSE 子句中的返回值。

如果您在第一个 WHEN 子句前面未指定比较测试表达式,系统将计算 WHEN 子句中的每个表达式 (从左到右),第一个计算结果为 true 的表达式将导致返回其对应的 THEN 子句中的返回值。如果没有 WHEN 子句表达式的计算结果为 true,则返回值为 null,除非指定了 ELSE 语句,在这种情况下,将返回该 ELSE 子句中的返回值。

VALUES

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

语法

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

VALUES 是一个 SQL 运算符,等同于 SELECT 和 UNION,用于实现以下类型的操作:

  • 您可以编写 VALUES (1), (2) 以返回两个行,每个行包含一个匿名列。

  • 您可以编写 VALUES (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 EXPEDITED 相关的一些额外注意事项。有关更多信息,请参阅 INSERT