JSON 동등 비교 시 주의할 점

JSON 동등 비교 시 주의할 점 (Caveats)

JSON 값을 서로 같은지 비교하려 할 때, 결과가 단순하게 나오지 않는 경우가 있어요. 같은 논리적 내용이라도 파일에 적힌 물리적 형태에 따라 다르게 판정될 수 있으니, 이번 페이지에서 그 기준을 정리해 볼게요.

출처: 공식문서

동등 비교 (Equality Comparison)

현재 DuckDB에서 JSON 파일의 동등 비교는 평가되는 문맥에 따라 결과가 달라질 수 있어요. 어떤 때는 원문 텍스트(raw text)를 그대로 비교하고, 어떤 때는 논리적 내용(logical content)을 기준으로 비교하기 때문이죠.

⚠️ 주의: 현재 JSON 동등 비교는 문맥에 따라 달라질 수 있습니다. 어떤 경우에는 원문 텍스트 기준으로, 어떤 경우에는 논리적 내용 기준으로 비교됩니다.

아래 쿼리는 모든 필드에서 true를 반환해요.

SELECT
    a != b, -- Space is part of physical JSON content. Despite equal logical content, values are treated as not equal.
    c != d, -- Same.
    c[0] = d[0], -- Equality because space was removed from physical content of fields:
    a = c[0], -- Indeed, field is equal to empty list without space...
    b != c[0], -- ... but different from empty list with space.
FROM (
    SELECT
        '[]'::JSON AS a,
        '[ ]'::JSON AS b,
        '[[]]'::JSON AS c,
        '[[ ]]'::JSON AS d
    );
(a != b) (c != d) (c[0] = d[0]) (a = c[0]) (b != c[0])
true true true true true

여기서 핵심은 이거예요. 공백 하나가 JSON의 물리적 내용(physical content) 에 포함되어 있으면, 논리적으로 같아 보여도 !=(같지 않음)로 판정됩니다. '[]''[ ]'처럼 겉보기에는 똑같아 보이는 값이라도, 실제로는 빈 배열에 공백이 들어 있느냐에 따라 동등 비교 결과가 갈리는 것이죠. JSON 동등 비교를 쓸 때는 이 점을 염두에 두어야 해요.

더 알아보기 (Learn more)

  • JSON 타입과 관련 함수는 JSON 형식 개요 문서에서 더 다룹니다.
  • JSON 데이터를 DuckDB에서 어떻게 로드하는지는 JSON 로드 문서를 참고하세요.