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

px9o7tmv  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(452)

雅典娜似乎在我的查询结果中包含了csv列标题。我使用下面的ddl重新创建了表 TBLPROPERTIES ("skip.header.line.count"="1") 删除标题。
我运行以下查询来验证 CREATE TABLE ddl成功了。下面查询之间的唯一区别是在where子句中使用单引号和双引号。问题是我在运行它们时得到了不同的结果。
查询1:

SELECT
  file_name
FROM table
WHERE file_name = "file_name"

上面的查询返回实际数据(请参阅下面的示例表),而不是仅返回file\u name字段为“file\u 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'

上面的查询返回 no results ,如果csv列标题未包含在结果中,则与预期一样。
我对第一个返回任何结果的查询感到非常困惑。在这一点上,我已经浏览了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")
xpcnnkqh

xpcnnkqh1#

我只是想把戈登的回答再详细一点。您的第一个查询:

SELECT
  file_name
FROM table
WHERE file_name = "file_name"

在本例中,双引号导致查询引擎处理 "file_name" 作为列标识符,而不是值,因此查询在功能上与:

SELECT
  file_name
FROM table
WHERE file_name = file_name

显然(以这种方式编写时)条件总是true,因此返回完整的表。

brccelvz

brccelvz2#

单引号是分隔字符串的sql标准。
双引号用于转义分隔符。所以呢 "file_name" 指该名称的列。有些数据库还接受字符串的双引号。那真是令人困惑。别那么做。
例如,在原始标记中,hive使用backticks来转义标识符和字符串的双引号。presto使用双引号(这是标准)来分隔标识符。

相关问题