imhamburger 님의 블로그

PostgreSQL에서 JSON 또는 JSONB 컬럼의 값 존재 여부 확인하기 본문

끄적끄적

PostgreSQL에서 JSON 또는 JSONB 컬럼의 값 존재 여부 확인하기

imhamburger 2025. 7. 27. 11:18

최근, 이력서 작성 폼 중 사용자가 얼마나 많이 내용을 입력했는지를 파악하기 위한 지표가 필요해졌다.

우리 회사에서는 PostgreSQL을 사용하고 있는데, 이력서 관련 테이블에는 JSON 또는 JSONB 타입의 컬럼이 다수 존재한다.

이 컬럼들 안에는 작성자가 입력한 다양한 key-value 형태의 정보들이 저장되어 있다. 예를 들어 careerForm, basicForm, educationForm 등의 컬럼들이 그런 형태이다.

 

보통이라면 JSON 안의 키를 꺼내서 세부 데이터를 분석하는 방식으로 접근할 수 있지만, 이번 목적은 사용자가 각 항목에 입력을 했는지 여부만 판단하는 것이었기 때문에, 내용이 존재하면 True, 비어있거나 NULL이면 False를 반환하는 방식이 적합하다고 판단했다.

 

이를 위해 다음과 같은 SQL 문을 작성하여, 각 항목의 작성 여부를 Boolean 값으로 판단하고, 이를 BigQuery에 저장해 활용하고자 했다:

("careerForm" IS NOT NULL AND "careerForm"::text <> '{}') AS "careerForm",
("educationForm" IS NOT NULL AND "educationForm"::text <> '{}') AS "educationForm",
...

이러한 방식은 다음과 같은 장점이 있다:

  • JSON 내부의 상세 구조를 몰라도 된다.
  • 단순히 입력 여부만 체크하면 되기 때문에 쿼리가 가볍고 명확하다.
  • Boolean 값으로 결과를 반환하여, 추후 집계나 시각화에도 유리하다.

결과적으로, JSONB 컬럼을 하나하나 파싱하기보다는 단순히 "내용이 있는지 여부"만 확인하는 이 접근이 지표 설계 목적에 더 부합했다.

 

그리고 이를 Lambda 파이썬 서버에 올려야했다.

이때 f스트링으로 sql 쿼리를 처리해야 하는데, 중괄호 {} 이부분이 에러가 났다.

 

 

문제원인

파이썬에서 f-string을 쓸 때 {}는 변수를 넣는 자리로 인식되기 때문에,

f"SELECT ... <> '{}'"   # ❌ 에러 또는 이상한 결과

처럼 쓰면 에러가 나거나 비어 있는 값으로 처리된다.

 

 

해결방법

중괄호 이스케이프 (f-string 안에서 {} 문자 그대로 쓰기)

f"SELECT ..., column::text <> '{{}}' ..."

{{ 와 }} 로 작성하면 실제 SQL에는 {}로 들어간다.