【问题标题】:Syntax Error when using a case when conditional有条件的情况下使用 case 时的语法错误
【发布时间】:2021-10-19 13:32:44
【问题描述】:

我收到以下错误:

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

【问题讨论】:

  • 问题根本不在于条件,而在于2020Q4_revenue 不是有效标识符(用作列别名)。你need to quote it(如果你坚持使用那个名字)。
  • 请注意,您也可以使用filter() 运算符进行条件聚合:sum(amount * exchange_rate) filter (where ...) 我发现这样更易于阅读(但您仍然需要为列别名使用有效的 SQL 标识符)

标签: postgresql column-alias


【解决方案1】:

2020Q4_revenue 这样的别名是SQL 中的“标识符”,所以它必须符合the rules

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2021-09-22
    • 2012-11-30
    相关资源
    最近更新 更多