Select 命令

最近更新时间:2022-04-14 21:42:54

我的收藏

概述

对象存储(Cloud Object Storage,COS)Select 功能仅支持 SELECT SQL 查询指令,以便检索所需的部分数据,减少传输的数据量。这样可以减少成本,同时降低请求延时。以下是 SELECT 查询支持的标准子句:
SELECT 语句
WHERE 子句
LIMIT 子句
注意
COS Select 当前暂不支持子句查询或者 joins。

SELECT 语句

SELECT 语句可以实现从 COS 对象中检索到您所希望看到的数据,您可以以列的名称、函数或者表达式等维度进行查询,并以一个列表的形式返回查询结果。SELECT 语句调用格式如下:
SELECT *
SELECT projection [ AS column_alias | column_alias ] [, ...]
第一句 SELECT 语句带有*(星号),将返回 COS 对象中的所有列。第二句 SELECT 语句使用用户自定义输出标量表达式,projection为每列创建自定义名称的输出列表。

WHERE 子句

WHERE 子句使用以下语法:
WHERE condition
WHERE 子句通过 condition 进行过滤。condition 是一种可以返回布尔结果的表达式,只有返回值为 TRUE 的行才会在结果中输出。

LIMIT 子句

LIMIT 子句使用以下语法:
LIMIT number
LIMIT 子句限制每次查询返回的记录数量,您可以通过 number 参数指定这个限制。

访问属性

SELECT 和 WHERE 子句可以通过以下任意方式选择查询的字段,您可以根据文件格式是 CSV 还是 JSON 进行选择。

CSV

列编号:您可以通过 _N指定查询第 N 列的数据。对于任意一份 CSV 文件,列编号从1开始递增。如第一列编号为_1 ,第二列编号为_2 。在 SELECT 和 WHERE 子句中,通过_N或者alias._N指定需要查询的列均为合法的方式。
列表头:如果待查询的 CSV 文件中有表头, SELECT 和 WHERE 子句中可以通过这些表头指定需要查询的列。在 SQL 语句中,您可以在 SELECT 和 WHERE 子句中通过alias.column_name 或者column_name的方式指定。

JSON

文档(Document):您可以通过alias.name的方式访问 JSON 文档。嵌套数组则可以通过如alias.name1.name2.name3的方式访问。
列表(List):您可以通过索引访问列表中的元素,索引从0开始编号,并使用[]操作符。例如,您可以通过alias[1]访问 JSON 列表中的第2个元素。如果您需要访问嵌套数组,也可以通过如alias.name1.name2[1].name3这样的方式进行访问。
示例 以下为该示例的数据样本:
{
"name": "Leon",
"org": "Tencent",
"projects":
[
{"project_name":"project1", "completed":true},
{"project_name":"project2", "completed":false}
]
}
示例 1:以下为在数据样本中查询 name 的 SQL 语句和查询结果:
Select s.name from COSObject s
{"name":"Leon"}
示例 2:以下为在数据样本中查询 project_name 的 SQL 语句和查询结果:
Select s.projects[0].project_name from COSObject s
{"project_name":"project1"}

表头和属性名称的大小写敏感性

您可以使用双引号来标注 CSV 文件的表头和 JSON 文件的属性名称是否大小写敏感。如果不添加双引号,则说明表头/属性名是大小写不敏感的。在您设定不明确的情况下,COS Select 可能会抛出异常。
示例 1:查询表头/属性名称中有"NAME"的对象。 以下 SQL 示例未使用双引号,表明是大小写不敏感的,由于表中有这个表头,所以最终会成功返回数值。
SELECT s.name from COSObject s
以下 SQL 示例使用双引号,表明是大小写敏感的。由于表中实际上未包含这个表头,所以最终会返回400错误SQLParsingError
SELECT s."name" from COSObject s
示例 2:查询表头/属性名称中有"NAME"和"name"的对象。 以下 SQL 示例未使用双引号,表明是大小写不敏感的,由于表中同时存在"NAME"和"name"两个表头,查询指令设定不明确,会抛出异常 AmbiguousFieldName。
SELECT s.name from COSObject s
以下 SQL 示例使用了双引号,表明是大小写敏感的,由于表中已经存在"NAME"这个表头,会成功返回查询结果。
SELECT s."NAME" from COSObject s

使用保留字段作为用户自定义字段

COS Select 的 SQL 表达式具有一些保留字段,包含了函数名称,数据类型,操作符等。在某些情况下,用户可能会使用这些保留字段作为 CSV 文件的列表头或者 JSON 文件的属性名称,这时候可能与保留字段存在冲突。在这种情况下,您可以使用双引号来表明您正在使用自定义字段,否则 COS 将返回400 parse error
如您需要查阅完整的保留字段列表,请参见 保留字段
示例:待查询的对象的表头/属性名称具有一个保留字段"CAST"。 以下 SQL 示例使用了双引号表明 CAST 是用户自定义字段,将成功返回查询结果。
SELECT s."CAST" from COSObject s
以下 SQL 示例未使用双引号表明 CAST 是用户自定义字段,COS 将作为保留字段处理,将返回400 parse error
SELECT s.CAST from COSObject s

标量表达式

在 SELECT 语句和 WHERE 子句中,您可以使用 SQL 标量表达式(返回标量的表达式)。目前 COS Select 支持以下形式:
literal:SQL 文本。
column_reference:column_name 或者 alias.column_name。
unary_opexpression: SQL 一元运算符。
expressionbinary_opexpression:SQL 二元运算符。
func_name:被调用的标量函数的名称。
expression [ NOT ] BETWEEN expression AND expression
expression LIKE expression [ ESCAPE expression ]