빠른 참조

PostgreSQL JSON 및 JSONB 치트시트

PostgreSQL JSON 및 JSONB 빠른 참조 가이드: 추출 연산자, 포함 및 존재 여부 검사, 경로 수정, 집계 함수를 정리합니다.

· 게시일

PostgreSQL은 json(텍스트 원본 그대로 저장)과 jsonb(GIN 인덱싱 및 빠른 조회를 지원하는 분해된 이진 형식)를 통해 JSON 데이터를 기본적으로 지원합니다.

추출 연산자

단일 화살표(->, #>)는 json/jsonb를 반환합니다. 이중 화살표(->>, #>>)는 text를 반환합니다.

SELECT * FROM users WHERE data->>'name' = 'John';
SELECT data->>'name' AS name FROM users;
연산자 좌변 타입 우변 타입 설명 반환 타입
-> jsonb int 0 기반 인덱스로 배열 요소 가져오기 jsonb
-> jsonb text 키로 객체 필드 가져오기 jsonb
#> jsonb text[] 지정된 경로의 값 가져오기 jsonb
->> jsonb int 배열 요소를 텍스트로 가져오기 text
->> jsonb text 객체 필드를 텍스트로 가져오기 text
#>> jsonb text[] 경로의 값을 텍스트로 가져오기 text

경로 쿼리 예제

-- Extract nested data.address.city as text
SELECT data#>>'{address,city}' FROM customers;

-- Extract second element in items array
SELECT order_info->'items'->>1 FROM orders;

불리언 및 포함 연산자 (jsonb 전용)

-- Check if JSON object contains a specific top-level key
SELECT * FROM users WHERE data ? 'email';

-- Check if JSON contains all keys in array
SELECT * FROM users WHERE data ?& array['name', 'email'];

-- Check if JSON contains any key in array
SELECT * FROM users WHERE data ?| array['mobile', 'email'];

-- Containment: Left contains Right
SELECT * FROM users WHERE data @> '{"role": "admin"}'::jsonb;

-- Contained by: Left is contained within Right
SELECT * FROM users WHERE data <@ '{"role": "admin", "active": true}'::jsonb;

JSONB 데이터 수정 및 업데이트

연결 및 키 삭제

-- Append or update key in jsonb object
UPDATE users SET data = data || '{"active": true}'::jsonb WHERE id = 1;

-- Delete key from object
UPDATE users SET data = data - 'temporary_token' WHERE id = 1;

-- Delete element from array by index
UPDATE users SET tags = tags - 1 WHERE id = 1;

-- Delete nested path
UPDATE users SET data = data #- '{profile,avatar}' WHERE id = 1;

jsonb_set 함수

-- Syntax: jsonb_set(target, path, new_value, create_missing)
UPDATE users
SET data = jsonb_set(data, '{contact,phone}', '"555-0199"', true)
WHERE id = 1;

집계 및 생성 함수

-- Convert rows to JSON array
SELECT json_agg(u) FROM (SELECT id, name FROM users) u;

-- Build JSON object from key-value pairs
SELECT json_build_object('id', id, 'username', name) FROM users;

-- Expand JSON object to table rows
SELECT * FROM json_each('{"a": 1, "b": 2}');
-- Returns columns: key (text), value (json)

참고 자료

관련 주제