source

UNION을 사용할 때 json[] 유형의 등호 연산자를 식별할 수 없습니다.

manysource 2023. 2. 8. 19:47

UNION을 사용할 때 json[] 유형의 등호 연산자를 식별할 수 없습니다.

를 사용하여 단일 테이블에서 여러 쿼리를 수행하려고 합니다.UNION규칙.

테이블이 두 개 있습니다.

  • 프로젝트(ID, 이름, 핀 부울)
  • 스킬(프로젝트에 200만 m)

먼저 다음 행의 배열을 찾고 있습니다.pinned로 설정하다.true나머지 엔트리를 최신 엔트리로 채웁니다).pinned로 설정하다.false)

SELECT
  project.id AS project_id,
  project.name AS project_name,
  array_agg(json_build_object('skill_id', project_skills.id,'name', project_skills.skill)) AS skills
from project
LEFT OUTER JOIN project_skills on project.name = project_skills.project
WHERE project.pinned = true
GROUP BY project_id,project_name

UNION

SELECT
  project.id AS project_id,
  project.name AS project_name,
  array_agg(json_build_object('skill_id', project_skills.id,'name', project_skills.skill)) AS skills
from project
LEFT OUTER JOIN project_skills on project.name = project_skills.project
WHERE project.id != 1 AND project.pinned = false
GROUP BY project_id,project_name
ORDER BY project.create_date DESC LIMIT 5

이 쿼리를 실행하면 다음 오류가 나타납니다.

ERROR:  could not identify an equality operator for type json[]
LINE 7:   array_agg(json_build_object('skill_id', project_skills.id,...

나는 이 오류를 이해할 수 없다.두 결과에서 json 열을 비교하려고 하기 때문에 실패한 것입니까?

Postgres 9.4를 사용하고 있습니다.

를 사용하는 경우UNIONDBMS는 중복된 행을 모두 삭제합니다.이렇게 하려면 , 2 행이 같거나 같은지 아닌지를 특정할 필요가 있습니다.즉, 비교 중인 두 행의 각 열을 보고 동일한지 여부를 확인하는 것입니다.

에러 메세지가 표시되고 있는 것은, 다음의 어느쪽인가를 사용해 열이 작성되고 있는 경우입니다.array_agg(json_build_object(...))유형적인 가치를 만들어냅니다.json[]즉, "json 값의 배열"을 의미합니다.Postgres는 JSON 값의 2개의 어레이를 비교하는 방법을 모르기 때문에 Postgres는 JSON 값의 2개의 어레이를 비교할 수 없습니다.UNION생성된 복제품.

실제로 중복 제거를 신경 쓰지 않는 경우 가장 간단한 해결책은UNION ALL이 스텝은 생략합니다.

코멘트에서 지적한 바와 같이 중복을 제거하려면 비교 연산자가 정의된 값으로 값을 지정할 수 있습니다.가장 일반적인 해결책은 텍스트에 캐스팅하는 것입니다(예:some_value::text또는CAST(some_value as text)JSON의 경우 포맷이 무시되는 타입이 필요할 수 있습니다.

캐스팅 할 수 있어json로.jsonb, 또는json[]로.jsonb[]또는 이 예에서는,jsonb직접 와 함께array_agg(jsonb_build_object(...))보다는array_agg(json_build_object(...)).

알고 보니 내가 해야 할 일은UNION ALL- 이것은 비교하려는 시도를 무시한 것 같습니다.json여러 쿼리에 걸쳐 유형을 지정합니다.

언급URL : https://stackoverflow.com/questions/43718733/couldnt-identify-equality-operator-of-type-json-when-using-union