Ошибка операции Postgres JSON в выражении рекурсивной общей таблицы - PullRequest
0 голосов
/ 26 сентября 2018

Использование этого Cte:

WITH RECURSIVE "_.catalogIds" AS (
    SELECT "catalog"."name", "catalog"."parent_id", "catalog"."owner_id", "catalog"."image_id", "catalog"."id", "catalog"."created", "catalog"."updated", "catalog"."icon_class" 
    FROM "catalog" 
    WHERE "catalog"."id" = 1
    UNION 
    SELECT "catalog"."name", "catalog"."parent_id", "catalog"."owner_id", "catalog"."image_id", "catalog"."id", "catalog"."created", "catalog"."updated", "catalog"."icon_class" 
    FROM "_.catalogIds"
    INNER JOIN "catalog" ON "catalog"."id" = "_.catalogIds".parent_id
)

В этой таблице:

CREATE TABLE catalog (
  id         BIGSERIAL,
  created    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  name       JSON      NOT NULL,
  parent_id  BIGINT,
  owner_id   BIGINT    NOT NULL,
  image_id   BIGINT,
  icon_class VARCHAR(255)       DEFAULT 'fa fa-book',

  PRIMARY KEY (id),
  FOREIGN KEY (parent_id) REFERENCES catalog (id) ON DELETE CASCADE,
  FOREIGN KEY (owner_id) REFERENCES "user" (id) ON DELETE CASCADE,
  FOREIGN KEY (image_id) REFERENCES media_file (id) ON DELETE SET NULL
);

В результате ошибки postgres говорится, что он не может найти оператор равенства для типа json.Еще более странно, он говорит, что ошибка в позиции 42, которая находится в части выбора оператора.Также, если я сокращаю запрос, ошибка перемещается назад, поскольку она остается в определенном месте запроса.Я написал много рекурсивных запросов, но этот кажется очень странным.Это похоже на ошибку postgres для меня, но мне нужно подтверждение и пример обхода / работы.

1 Ответ

0 голосов
/ 26 сентября 2018

UNION устраняет дубликаты, поэтому запрос сравнивает результирующие строки запросов компонентов.К сожалению, тип JSON не имеет оператора равенства, поэтому строки, содержащие столбец типа, сравнивать нельзя.

Вы можете привести столбец к JSONB в обоих запросах:

    SELECT "catalog"."name"::jsonb, ...

или использовать UNION ALL, если вам не нужны дубликаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...