首页 > 解决方案 > 有条件的情况下使用 case 时的语法错误

问题描述

我收到以下错误:

postgresql 错误:在“2020”第 2 行或附近出现语法错误:... THEN amount * split_exchange_rate ELSE 0 END) AS 2020Q4_rev...

请参阅下面的代码。我正在使用 postgresql

SELECT object_id
  , SUM(CASE WHEN created::date >= '2020-10-01' AND created::date <= '2020-12-31' THEN amount * exchange_rate ELSE 0 END) AS 2020Q4_revenue
  , SUM(CASE WHEN created::date >= '2021-01-01' AND created::date <= '2021-03-31' THEN amount * exchange_rate ELSE 0 END) AS 2021Q1_revenue
  , SUM(CASE WHEN created::date >= '2021-04-01' AND created::date <= '2021-06-30' THEN amount * exchange_rate ELSE 0 END) AS 2021Q2_revenue
  , SUM(CASE WHEN created::date >= '2021-07-01' AND created::date <= '2021-09-30' THEN amount * exchange_rate ELSE 0 END) AS 2021Q3_revenue
from raw_data.purchase_revenue pr
group by 1

标签: postgresqlcolumn-alias

解决方案


别名 like2020Q4_revenue是 SQL 中的“标识符”,因此它必须符合以下规则

SQL 标识符和关键字必须以字母(a- z,但也包括带有变音符号和非拉丁字母的字母)或下划线 ( _) 开头。标识符或关键字中的后续字符可以是字母、下划线、数字 ( 0- 9) 或美元符号 ( $)。请注意,根据 SQL 标准的字母,标识符中不允许使用美元符号,因此使用它们可能会降低应用程序的可移植性。

如果用双引号括起来,您仍然可以使用该别名:

还有第二种标识符:分隔标识符引用标识符。它由双引号 ( ") 中的任意字符序列组成。分隔标识符始终是标识符,而不是关键字。所以"select"可以用来引用名为“select”的列或表,而未加引号的 select 将被视为关键字,因此在需要表或列名的地方使用时会引发解析错误。

带引号的标识符可以包含任何字符,但代码为零的字符除外。(要包含双引号,请写两个双引号。)


推荐阅读