postgresql - 创建聚合initcond中的postgresql格式错误的数组文字
问题描述
运行 postgres 11.3。这是sql代码
create type _stats_agg_accum_type AS (
cnt bigint,
min double precision,
max double precision,
m1 double precision,
m2 double precision,
m3 double precision,
m4 double precision,
q double precision[],
n double precision[],
np double precision[],
dn double precision[]
);
create aggregate stats_agg(double precision) (
sfunc = _stats_agg_accumulator,
stype = _stats_agg_accum_type,
finalfunc = _stats_agg_finalizer,
combinefunc = _stats_agg_combiner,
parallel = safe,
initcond = '(0,,, 0, 0, 0, 0, {}, {1,2,3,4,5}, {1,2,3,4,5}, {0,0.25,0.5,0.75,1})'
);
这给了我
ERROR: malformed array literal: "{1"
DETAIL: Unexpected end of input.
SQL state: 22P02
空数组文字工作正常。我还尝试了一个{1}
可以正常工作的单元素文字。每当我有 2 个或更多元素时,它都会给我这个错误。
作为一种解决方法,我可以传入空数组并在第一遍初始化它们,但这很难看。
解决方案
您需要在数组周围加上引号,这是因为数组位于行的文本版本中。
通过将输入作为一行来轻松测试并查看 postgres 如何格式化它(此处需要在数组周围加上单引号,因为{}
它是文本中的数组):
SELECT ROW(0,NULL,NULL, 0, 0, 0, 0, '{}', '{1,2,3,4,5}', '{1,2,3,4,5}', '{0,0.25,0.5,0.75,1}')
回报:
(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")
因此,您需要这样做:
...
initcond = '(0,,,0,0,0,0,{},"{1,2,3,4,5}","{1,2,3,4,5}","{0,0.25,0.5,0.75,1}")'
为什么在为空或只有一个值的数组上不需要引号:
数组中的多个值以逗号分隔,一行中的字段也以逗号分隔。如果您提供一行作为'(0,{1,2})'
,PG 会将其解释为三个字段:0
、{1
、2}
。自然地,在这种情况下,您会收到有关格式错误的数组的错误。将字段放在引号中意味着这些引号中的所有内容都是一个字段。因此'(0,"{1,2}")'
将被正确解释为0
, {1,2}
。如果数组为空或仅包含一个值,则不会有逗号,因此正确解析该字段没有问题。
推荐阅读
- node.js - 如何在 Angular 8 中验证登录和注册表单
- spring - Spring Cloud Dataflow 聚合拆分列表
- python - 在 While-True 语句中满足条件后,Tkinter 停止运行
- algorithm - 如何获得 n mod p 次多项式的系数?
- mysql - 按 id 合并同一数据库中的表
- python - 突出显示选定的数据框行
- java - 如何使用 spring-spqr graphql-spqr-spring-boot-starter graphQL 的注释创建片段
- ruby-on-rails - 在销毁记录之前取消设置依赖关联的正确方法?
- python - 有趣的 MYPY 行为 - 关于 difflib 的警告仅一次
- java - 如何从用户定义类型的优先级队列中删除对象