ОШИБКА: неверный синтаксис ввода для типа json - PullRequest
0 голосов
/ 03 декабря 2018

Я использую PostgreSQL 10.4 и у меня 2 таблицы:

person:

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

страна:

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

Это запрос, который я пытаюсь выполнитьrun:

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" недействителен.

КОНТЕКСТ: данные JSON, строка 1: nationalitiesCount

Вторая строка содержитпервый ' выделен как код, вызывающий появление ошибки.

Вопрос: Как исправить ошибку?

1 Ответ

0 голосов
/ 04 декабря 2018

Первая проблема заключается в том, что ссылки на столбцы не должны быть в одинарных кавычках, хотя они могут быть / иногда должны быть в двойных кавычках, поэтому ему не нравится '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...