WHERE 子句中的单引号与双引号返回不同的结果



似乎雅典娜在我的查询结果中包含CSV列标题。我使用下面包含的 DDL 重新创建了表,使用TBLPROPERTIES ("skip.header.line.count"="1")删除标头。

我正在运行以下查询来验证 DDLCREATE TABLE是否有效。以下查询之间的唯一区别是在 WHERE 子句中使用单引号和双引号。问题是我在运行它们时得到不同的结果。

查询 1:

SELECT
file_name
FROM table
WHERE file_name = "file_name"

上面的查询返回实际数据(请参阅下面的示例表(,而不仅仅是file_name字段为"file_name"的行。

+-------+--------------------+
| Row # |     file_name      |
+-------+--------------------+
|     1 |                    |
|     2 | 1586786323.8194735 |
|     3 |                    |
|     4 | 1586858857.3117666 |
|     5 | 1586858857.3117666 |
|     6 | 1586858857.3117666 |
|   ... |                    |
+-------+--------------------+

查询 2:

SELECT
file_name
FROM table
WHERE file_name = 'file_name'

如果结果中未包含 CSV 列标题,则上述查询将按预期返回no results

我对返回任何结果的第一个查询感到非常困惑。在这一点上,我已经浏览了AWS文档,似乎我对DDL没有做错任何事,SQL不应该关心我是否使用单引号还是双引号。我在这里错过了什么?

DDL:

CREATE EXTERNAL TABLE `table` (
`file_name` string,
`ticker` string,
...
)
ROW FORMAT SERDE 
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES ( 
'escapeChar'='\', 
'separatorChar'=',')
LOCATION
's3://{bucket_name}/{folder}/'
TBLPROPERTIES (
"skip.header.line.count"="1")

单引号是分隔字符串的 SQL 标准。

双引号用于转义分隔符。 因此,"file_name"指的是该名称的列。 某些数据库还接受字符串的双引号。 这简直令人困惑。 别这样。

例如,在原始标记中,Hive 使用反引号来转义标识符,并使用双引号来转义字符串。 Presto 使用双引号(这是标准(来分隔标识符。

只是为了稍微扩展一下戈登的答案。您的第一个查询:

SELECT
file_name
FROM table
WHERE file_name = "file_name"

在这种情况下,双引号会导致查询引擎将"file_name"视为列标识符,而不是值,因此查询在功能上与以下内容相同:

SELECT
file_name
FROM table
WHERE file_name = file_name

显然(以这种方式编写时(条件始终为真,因此返回整个表。

最新更新