【问题标题】:ERROR: invalid input syntax for type json错误:json 类型的输入语法无效
【发布时间】:2018-12-04 07:45:29
【问题描述】:

我使用的是 PostgreSQL 10.4 并且有 2 个表:

人:

CREATE TABLE person (
  nationality character varying(100),
  name character varying(100),
  age integer
);

国家:

CREATE TABLE country (
  demonym character varying(50),
  name character varying(50)
);

这是我要运行的查询:

select "c"."name",
    (SELECT row_to_json(r) FROM (
      SELECT
        COALESCE(sum(CASE WHEN p."nationality"='finn' THEN 1 ELSE 0 END),0) as "1",
        COALESCE(sum(CASE WHEN p."nationality"='spanish' THEN 1 ELSE 0 END),0) as "2"

      FROM "person" as p
      WHERE "p"."nationality"="c"."demonym"
      ) as r) as "nationalitiesCount"
from "country" as c         
WHERE 'nationalitiesCount'::json->'1' > 10

这会产生一个错误:

错误:json 类型的输入语法无效

第 11 行:在哪里 'nationalitiesCount'::json->'1' > 10

详细信息:令牌“nationalitiesCount”无效。

CONTEXT:JSON 数据,第 1 行:nationalitiesCount

第二行将第一个' 突出显示为导致错误出现的代码。

问题:如何纠正错误?

【问题讨论】:

  • 请解决您的问题。错误消息不适合损坏的查询。由于缺少逗号,将是 ERROR: syntax error at or near "SELECT"。显示您的实际查询并始终披露正在使用的 Postgres 版本。并显示"Average"的表定义。除此之外,'salaries'->>'1'::json 甚至没有意义。您可能想从手册开始herehere
  • @ErwinBrandstetter 编辑问题。通过 9.43 中的第二个链接,该表显示为了访问 json 对象的 prop 值,我们需要具有以下语法:'{"a":1,"b":2}'::json->>'b' 这是我试图复制的内容,您可以在我的代码中看到 sn-p以上。
  • @ErwinBrandstetter 已更正。
  • 这是一个失败的案例。修复语法错误(标识符需要双引号)让我们无处可去。您的子查询与nationality 相关,但您尝试同时计算不同的国籍。没有意义。您的编辑改进了问题,但您仍然不知道查询应该实现什么。所以我们甚至不能开始尝试解决这个问题。

标签: postgresql


【解决方案1】:

第一个问题是对列的引用不应该用单引号引起来,尽管它们可以/有时必须用双引号引起来,这就是它不喜欢 'nationalitiesCount'::json->'1' 的原因.第二个是列名nationalitiesCount 在查询的SELECT 部分中定义,不能在定义它的查询的WHERE 子句中引用,因此您可以将查询移动到子查询中,以便您可以在外部引用它子查询。

select *
from (select "c"."name",
    (SELECT row_to_json(r) 
     FROM (
      SELECT
       COALESCE(sum(CASE WHEN p."nationality"='finn' THEN 1 ELSE 0 END),0) as "1",
       COALESCE(sum(CASE WHEN p."nationality"='spanish' THEN 1 ELSE 0 END),0) as "2"

       FROM "person" as p
       WHERE "p"."nationality"="c"."demonym"
     ) as r) as "nationalitiesCount"
from "country" as c 
) t
WHERE (t."nationalitiesCount"->>'1')::integer > 10

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2023-01-15
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2019-02-11
    • 2018-09-29
    • 1970-01-01
    相关资源
    最近更新 更多