CodeGym /행동 /SQL SELF /JSON 오브젝트에서 데이터 추출하기

JSON 오브젝트에서 데이터 추출하기

SQL SELF
레벨 33 , 레슨 2
사용 가능

JSONB는 진짜 강력한 도구야. 복잡한 데이터 구조, 예를 들면 중첩된 오브젝트나 배열 같은 것도 저장할 수 있지. 근데 그냥 JSONB에 데이터만 저장한다고 끝이 아니야 — 그걸 꺼내 쓸 줄도 알아야 해. 예를 들어, users 테이블에 data라는 컬럼이 있고, 거기에 모든 유저 설정이 JSONB로 저장돼 있다고 해보자. 유저가 어떤 테마를 쓰는지 알고 싶으면? JSONB 오브젝트에서 그 값을 뽑아내야 해.

만약 JSONB가 보물상자라면, ->, ->>, #>> 같은 연산자랑 jsonb_extract_path() 같은 함수가 바로 열쇠야. 이제 이 열쇠들 어떻게 쓰는지 같이 알아보자.

JSONB 다룰 때 자주 쓰는 연산자

PostgreSQL에는 JSONB를 다루는 데 꼭 필요한 연산자들이 있어. 이걸로 키, 중첩 오브젝트, 배열에서 값을 뽑아낼 수 있지. 대표적인 것들 소개할게:

-> 연산자

-> 연산자는 오브젝트나 배열을 지정한 키로 뽑아와. JSON이랑 똑같은 포맷으로 값을 받고 싶으면 이 연산자를 쓰면 돼.

예시:

-- 데이터 예시
SELECT '{"name": "Alice", "age": 25}'::jsonb -> 'name';
-- 결과: "Alice"

->> 연산자

->> 연산자는 ->랑 비슷한데, 뽑아온 값을 텍스트로 돌려줘. 데이터 간단하게 텍스트로 보고 싶을 때 유용해.

예시:

-- 데이터 예시
SELECT '{"name": "Alice", "age": 25}'::jsonb ->> 'age';
-- 결과: "25" (문자열)

#>> 연산자

#>> 연산자는 중첩된 오브젝트에서 지정한 경로로 데이터를 뽑아와. 경로는 키 배열로 넘겨줘야 해.

예시:

-- 데이터 예시
SELECT '{"user": {"name": "Bob", "details": {"age": 30}}}'::jsonb #>> '{user, details, age}';
-- 결과: "30" (문자열)

->->>의 차이점:

데이터 타입(예: 배열이나 오브젝트)을 그대로 유지하고 싶으면 ->를 써. 텍스트가 필요하면 ->>를 쓰면 돼.

JSONB 함수 사용하기

jsonb_extract_path() 함수는 지정한 경로로 JSONB 오브젝트에서 값을 뽑아와. #>> 연산자랑 비슷한데, 좀 더 명확하게 쓸 수 있어.

예시:

SELECT jsonb_extract_path('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- 결과: "dark"

바로 텍스트 값이 필요하면 jsonb_extract_path_text()를 써. jsonb_extract_path()랑 똑같이 동작하는데, 결과를 문자열로 돌려줘.

예시:

SELECT jsonb_extract_path_text('{"user": {"name": "Alice", "settings": {"theme": "dark"}}}'::jsonb, 'user', 'settings', 'theme');
-- 결과: dark

실전 예제

키로 값 뽑아오기. 예를 들어, products라는 테이블이 있고, details 컬럼에 JSONB 데이터가 들어있다고 해보자:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT,
    details JSONB
);

INSERT INTO products (name, details) VALUES
    ('Laptop', '{"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}'),
    ('Phone', '{"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}');

결과:

id name details
1 Laptop {"brand": "Dell", "price": 1200, "specs": {"ram": "16GB", "cpu": "Intel i7"}}
2 Phone {"brand": "Apple", "price": 1000, "specs": {"ram": "4GB", "cpu": "A13"}}

모든 제품의 브랜드 뽑아보기.

SELECT name, details->'brand' AS brand FROM products;

결과:

name brand
Laptop "Dell"
Phone "Apple"

텍스트 값 뽑아오기. 따옴표 없는 브랜드가 필요하면 ->> 연산자를 써:

SELECT name, details->>'brand' AS brand FROM products;

결과:

name brand
Laptop Dell
Phone Apple

중첩 데이터 뽑아오기. 각 제품의 램(ram) 용량을 뽑아보자:

SELECT name, details#>>'{specs, ram}' AS ram FROM products;

결과:

name ram
Laptop 16GB
Phone 4GB

경로로 데이터 뽑아오기. jsonb_extract_path_text() 함수로도 똑같이 할 수 있어:

SELECT name, jsonb_extract_path_text(details, 'specs', 'ram') AS ram FROM products;

결과:

name ram
Laptop 16GB
Phone 4GB

흔한 실수랑 피하는 법

실수는 주로 이런 상황에서 나와:

  • 잘못된 경로로 데이터를 뽑으려고 할 때. 예를 들어, 키가 없으면 결과는 null이야.
  • 목적에 맞지 않는 연산자를 쓸 때. ->는 오브젝트나 배열 뽑을 때 쓰고, 텍스트가 필요하면 ->>를 써야 해.

실수 예시:

-- 실수: 'nonexistent' 키가 없음
SELECT details->>'nonexistent' FROM products;
-- 결과: null

팁: 쿼리 짜기 전에 항상 데이터 구조를 먼저 확인해. 그래야 실수 안 해.

실전에서 어떻게 쓰이나?

JSONB에서 데이터 뽑기는 실제 앱에서 진짜 많이 써:

  • 이커머스에서 상품 속성 다룰 때.
  • 웹앱에서 유저 설정 저장할 때.
  • 분석할 때 이벤트나 로그 같은 구조화된 데이터 처리할 때.

예시 하나 더! orders 테이블에 주문 데이터가 있다고 해보자:

CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    customer_name TEXT,
    items JSONB
);

INSERT INTO orders (customer_name, items) VALUES
    ('John', '[{"product": "Laptop", "quantity": 1}, {"product": "Mouse", "quantity": 2}]'),
    ('Alice', '[{"product": "Phone", "quantity": 1}]');

주문에서 모든 상품 이름을 뽑아보자:

SELECT customer_name, jsonb_array_elements(items)->>'product' AS product FROM orders;

결과:

customer_name product
John Laptop
John Mouse
Alice Phone

이제 더 깊이 들어가서 JSONB 중첩 데이터 다루기랑, 분석하기 편하게 변환하는 방법도 배워볼 거야. 더 재밌는 내용이 기다리고 있으니까 기대해!

2
과제
SQL SELF, 레벨 33, 레슨 2
잠금
JSON 객체에서 `->` 연산자를 사용해서 데이터 추출하기
JSON 객체에서 `->` 연산자를 사용해서 데이터 추출하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION