错误:语法错误:应为“)”,但在子查询中得到语句结束语句

Posted

技术标签:

【中文标题】错误:语法错误:应为“)”,但在子查询中得到语句结束语句【英文标题】:Error: Syntax error: Expected ")" but got end of statement case statements in subquery 【发布时间】:2019-07-12 14:42:57 【问题描述】:

我在弄清楚应该如何结束此查询时遇到问题,因为我在 BigQuery 中不断收到错误消息。

这是一个相对较大的查询,有几个联合都遵循几乎相同的语法。当我在子查询之后结束查询时,出现错误。

错误:语法错误:应为“)”但在 [133:54] 处得到语句结束

所有的联合都遵循相同的语法——只是来自不同的表

UNION ALL
  SELECT
    report_date,
    device_category,
    data_source,
    source,
    medium,
    LOWER(campaign_name) AS campaign_name,
    conversion_type,
    Brand,
    goal_completion_1,
    impressions,
    clicks,
    cost,
    conversions,
    profile
  FROM (
    SELECT
      report_date,
      device_category AS device,
      data_source,
      CASE
        WHEN data_source = 'Google Ads' THEN 'google'
        WHEN data_source = 'Adroll' THEN 'adroll'
        WHEN data_source = 'Facebook Ads' THEN 'facebook'
        WHEN data_source = 'Bing Ads' THEN 'bing'
        ELSE NULL
      END AS source,
      CASE
        WHEN data_source = 'Google Ads' THEN 'cpc'
        WHEN data_source = 'Adroll' THEN 'display'
        WHEN data_source = 'Facebook Ads' THEN 'paid_social'
        WHEN data_source = 'Bing Ads' THEN 'cpc'
        ELSE NULL
      END AS medium,
      0 AS goal_completion_1,
      0 AS impressions,
      0 AS clicks,
      0 AS cost,
      conversions,
      profile
    FROM
      `table`
  )

我有一个与此类似的查询,除了它以 where 语句结尾并且它似乎运行良好 - 但是当我在 from 之后添加任何内容时,我仍然得到相同的错误。

WHERE conversion_type <> 'Calls from ads'

【问题讨论】:

【参考方案1】:

如果不查看整个查询,很难确定问题出在哪里。

很可能,在一个结束子查询的末尾缺少一个结束括号,导致UNION 被视为在该子查询中。也有可能在整个查询之前有一个括号,此时它没有被关闭。

我发现,通过将每个 UNION'd 查询括在括号中,我可以在大型 UNION 查询中获得更多有用的错误消息,如下所示:

(
  SELECT ...
)
UNION ALL
(
  SELECT ...
)
UNION ALL
(
  SELECT ...
)

这至少会导致未闭合字符警告通常在每个组的结尾行号处触发,而不是在查询的结尾处。

虽然 Joakim 认为您选择的列多于可用列是正确的,但这并不是导致此错误消息的原因。

【讨论】:

以上是关于错误:语法错误:应为“)”,但在子查询中得到语句结束语句的主要内容,如果未能解决你的问题,请参考以下文章

语法错误:应为“(”或“,”或关键字 SELECT,但在 [6:1] 处获得关键字 DELETE

[C++][pcl][原创]pcl 语法错误意外标记} 应为语句 ia_fpcs.hpp

插入到语句中的sql查询和c#中的错误

如何在子查询中使用 select 语句? (Postgres)

得到 [bool] 格式错误的查询,应为 [END_OBJECT] 但找到 [FIELD_NAME]

语法错误:应为“(”或“,”或关键字 SELECT 但脚本结束