【问题标题】:syntax error at or near "'select to_char(application_date::timestamp, '""'select to_char(application_date::timestamp, '" 处或附近的语法错误
【发布时间】:2019-08-16 12:16:32
【问题描述】:
EXECUTE 'select to_char(application_date::timestamp, 'Mon-YY') as appl_month from my_schema.my_table;';

上面的 PostgreSQL EXECUTE 语句给出以下错误:

错误:“选择”处或附近的语法错误 to_char(application_date::timestamp, '" LINE 1: EXECUTE '选择 to_char(application_date::timestamp, 'Mon-YY... ^

**********错误**********

错误:“选择”处或附近的语法错误 to_char(application_date::timestamp, '" SQL 状态:42601 字符:9

任何建议都会有所帮助。

改为下面的语句

EXECUTE 'select to_char(application_date::timestamp, ' || quote_literal(Mon-YY) || ') from standard.npo_weekly_export;';

但是给出了新的错误:

ERROR:  syntax error at or near "'select to_char(application_date::timestamp, '"
LINE 1: EXECUTE 'select to_char(application_date::timestamp, ' || qu...
                ^
********** Error **********

ERROR: syntax error at or near "'select to_char(application_date::timestamp, '"
SQL state: 42601
Character: 9

预期输出: - 以 Mon-YY 格式按月计数

Application month   Application #   Final Approval #    
Jan-17              1,000           800
Feb-17              1,010           808
Mar-17              1,020           816
Apr-17              1,030           824

如果我执行以下查询:

select to_char(application_date, 'Mon-YY') as appl_month, 
    count(distinct application_id) as appl_count, 
    sum(final_approval_ind) as fa_count,
from my_schema.my_table 
group by appl_month 
order by appl_month;

生成的输出:(注意:按文本排序,而不是按日期)

"Apr-17";94374;19953
"Apr-18";87446;20903
"Aug-17";102043;21536
"Aug-18";91107;20386
"Dec-17";63263;13755
"Dec-18";21358;74
"Feb-17";89447;18084
"Feb-18";75426;16144
"Jan-17";86103;16394
"Jan-18";79403;17766
"Jul-17";90380;18929
"Jul-18";85439;20186
"Jun-17";95596;20403
"Jun-18";85764;18707
"Mar-17";112929;23323
"Mar-18";91179;21841
"May-17";101907;22349
"May-18";90885;21550
"Nov-17";78284;16791
"Nov-18";80472;7656
"Oct-17";87955;18524
"Oct-18";82821;17056
"Sep-17";80740;17788
"Sep-18";75785;18009

问题: to_char() 返回文本,它按文本而非日期排序。所以输出是混乱的,而不是按 Mon-YY 排序的。

【问题讨论】:

  • application_date是什么数据类型?
  • @HighPerformanceMark:尝试使用 quote_literal(Mon-YY),但出现新错误。有没有办法在动态 SQL 中处理 to_char 模式?
  • @a_horse_with_no_name: application_date 是 date 类型
  • 那么演员::timestamp就没用了
  • @a_horse_with_no_name: application_date 的格式为 YYYY-MM-DD,我需要从该日期提取 Mon-YY,我发现 to_char 将 YYYY-MM-DD 转换为 Mon-YY 但返回文本,所以接下来我提取 YY 部分和 Mon 部分,然后按 YY 和 Mon 排序。仍然不能回答我遇到的错误

标签: postgresql


【解决方案1】:

在保留数据类型的派生表(又称“子查询”)中进行聚合,然后在外部查询中进行排序:

select to_char(ap_month, 'Mon-YY') as appl_month
       appl_count, 
       fa_count
from (       
  select date_trunc('month', application_date) as ap_month, 
         count(distinct application_id) as appl_count, 
         sum(final_approval_ind) as fa_count,
  from my_schema.my_table 
  group by ap_month
) t
order by ap_month;

date_trunc('month', application_date) 会将application_date 标准化为月初,但会保留date 数据类型,以便外部查询中的排序正常工作。

我不知道您问题中的动态 SQL 应该做什么,但如果您出于任何原因需要将该查询用作动态 SQL,则需要通过将单引号加倍来转义单引号。

execute '
  select to_char(ap_month, ''Mon-YY'') as appl_month
         appl_count, 
         fa_count
  from (       
    select date_trunc(''month'', application_date) as ap_month, 
           count(distinct application_id) as appl_count, 
           sum(final_approval_ind) as fa_count,
    from my_schema.my_table 
    group by ap_month
  ) t
  order by ap_month;
'; -- end of dynamic SQL

但是使用 Postgres 的 dollar quoting 会更容易:

execute $dyn$
  select to_char(ap_month, 'Mon-YY') as appl_month
         appl_count, 
         fa_count
  from (       
    select date_trunc('month', application_date) as ap_month, 
           count(distinct application_id) as appl_count, 
           sum(final_approval_ind) as fa_count,
    from my_schema.my_table 
    group by ap_month
  ) t
  order by ap_month;
$dyn$; -- end of dynamic SQL

请注意,您可以嵌套美元引用的字符串,因此如果在函数内使用该查询,只需使用与函数体不同的分隔符(请参阅example in the manual)

【讨论】:

  • to_char 函数的问题是它返回文本,如果日期现在格式为 Mon-YY,我需要按 Mon-YY 格式的日期对最终输出进行排序,它将按文本排序而不是按日期。请在我使用 to_char 排序后查看我对输出的编辑。
  • @somnathchakrabarti:你现在完全改变了你的问题。而其中动态SQL的使用,更是让人迷惑不解。 execute 的目的是什么?
  • 使用动态 SQL 加载到表中是我无法更改的前提条件。这就是为什么最初我将问题限制在如何在 SP 中的 Execute 语句中处理 to_char 函数
  • 感谢关于双引号的建议。我尝试使用 ||'Mon-YY'||、||quote_literal(Mon-YY)||、“Mon-YY”等,但它反复出现错误。再次感谢!
猜你喜欢
  • 2018-01-26
  • 2014-04-26
  • 1970-01-01
  • 2017-02-20
  • 2014-03-12
  • 2013-09-10
  • 2017-06-10
  • 2015-02-23
  • 1970-01-01
相关资源
最近更新 更多