SQL - PostgreSQL, JSON Column

2026. 4. 6. 09:25ยท๐Ÿงฉ SQL

PostgreSQL

 

 

โœ… JSON Column์ด๋ž€?


ํ…Œ์ด๋ธ” ์•ˆ์— JSON ํ˜•์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” Column

MySQL๊ณผ PostgreSQL ๋ชจ๋‘ JSON ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฑธ ํ—ˆ์šฉํ•œ๋‹ค.

 

SQL์ด๋ฉด์„œ ๋™์‹œ์— NoSQL์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

 

์‚ฌ์šฉ ์‹œ๊ธฐ: ์œ ์—ฐํ•œ ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•  ๋•Œ(์–ด๋– ํ•œ column์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ํ•  ์ง€ ๋ชจ๋ฅผ ๋•Œ)

์œ ์—ฐ์„ฑ↑, ๊ตฌ์กฐ ์•ˆ์ •์„ฑ↓

 

 

โœ… JSON, JSONB


๊ฑฐ์˜ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

์ฐจ์ด์ ์€ ํšจ์œจ์„ฑ์ด๋‹ค.

JSON vs JSONB

JSON: ์ž…๋ ฅ๋œ text๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์ €์žฅํ•จ

JSONB: ๋ถ„ํ•ด๋œ Binary ํ˜•์‹์œผ๋กœ ์ €์žฅํ•จ(๋ฐ์ดํ„ฐ ์ž…๋ ฅ ์†๋„๊ฐ€ ์•ฝ๊ฐ„ ๋А๋ ค์ง„๋‹ค. JSON์—์„œ Binary๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ, ์ฒ˜๋ฆฌ ์†๋„๋Š” ์—„์ฒญ ๋นจ๋ผ์ง, ๋Œ€๋ถ€๋ถ„ JSONB ์„ ํ˜ธ)

 

CREATE TABLE users (
	user_id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
	profile JSONB
);

INSERT INTO
	users (profile)
VALUES
	(json_build_object('name', 'Taco', 'age', 30, 'city', 'Budapest')),
	(json_build_object('name', 'Giga', 'age', 25, 'city', 'Tbilisi', 'hobbies', json_build_array('reading', 'climbing')));

 

json_build_object, json_build_array

์ธ์ž์— ์•Œ๋งž์€ ๊ฐ’์„ ์ฃผ๋ฉด ๊ฐ๊ฐ object์™€ array๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค.

 

https://www.postgresql.org/docs/current/datatype-json.html

 

8.14. JSON Types

8.14. JSON Types # 8.14.1. JSON Input and Output Syntax 8.14.2. Designing JSON Documents 8.14.3. jsonb Containment and Existence 8.14.4. jsonb …

www.postgresql.org

 

 

โœ… Querying JSON


SELECT
	profile -> 'name',
	profile -> 'age',
	profile -> 'city'
FROM
	users;

 

 

SELECT
	profile ->> 'name',
	profile ->> 'age',
	profile ->> 'city'
FROM
	users;

JSON ํ˜•์‹์œผ๋กœ ์ €์žฅ๋˜์–ด์„œ ๋ถ™์€ " " ์—†์• ๊ธฐ

 

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	profile ->> 'city' AS city,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users;

JSON ๋‚ด๋ถ€์˜ ๋ฐฐ์—ด ์—ด๊ธฐ, Column ์ด๋ฆ„ ์ •ํ•ด์ฃผ๊ธฐ

 

Filtering Data on JSON Column

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	profile ->> 'city' AS city,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users
WHERE
	profile ? 'hobbies';

profile์— hobbies key๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ด

 

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	profile ->> 'city' AS city,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users
WHERE
	profile -> 'hobbies' ? 'climbing';

hobbies์— climbing์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ด

 

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	jsonb_array_length(profile -> 'hobbies') AS total_hobbies,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users
WHERE
	(profile ->> 'age')::INTEGER < 30;

profile์—์„œ age๋ฅผ ๊ฐ€์ ธ์™”์„ ๋•Œ text์ด๊ธฐ ๋•Œ๋ฌธ์— integer๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  jsonb๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด jsonb ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

?|

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	jsonb_array_length(profile -> 'hobbies') AS total_hobbies,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users
WHERE
	profile -> 'hobbies' ?| ARRAY['reading', 'traveling'];

?| ์—ฐ์‚ฐ์ž๋Š” ๋’ค์— ์ฃผ์–ด์ง€๋Š” ์กฐ๊ฑด์ด ์–ด๋А ๊ฒƒ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜๋ฉด ๋งŒ์กฑ๋˜๋Š” or ์—ฐ์‚ฐ์ž์ด๋‹ค.

 

?&

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	jsonb_array_length(profile -> 'hobbies') AS total_hobbies,
	profile -> 'hobbies' ->> 0 AS first_hobby
FROM
	users
WHERE
	profile -> 'hobbies' ?& ARRAY['reading', 'traveling'];

and ์—ฐ์‚ฐ์ž

 

SELECT
	profile ->> 'name' AS name,
	profile ->> 'age' AS age,
	jsonb_array_length(profile -> 'hobbies') AS total_hobbies,
	profile -> 'hobbies' ->> 0 AS first_hobby,
	profile ->> 'city' AS city
FROM
	users
WHERE
	profile ->> 'city' LIKE 'B%';

LIKE ๊ฒฐํ•ฉํ•ด์„œ ์‚ฌ์šฉ

 

 

โœ… Processing JSON


||

UPDATE users
SET
	profile = profile || jsonb_build_object('email', 'x@x.com');

json๊ณผ json์„ ๋ฐ›์•„์„œ ํ•ฉ์ณ์ง„ json์„ ๋ฐ˜ํ™˜

 

-

UPDATE users
SET
	profile = profile - 'email'
WHERE
	profile ->> 'name' = 'Giga';

key์™€ value ์ œ๊ฑฐ

 

jsonb_set

UPDATE users
SET
	profile = profile || jsonb_set(profile, '{hobbies}', (profile -> 'hobbies') || jsonb_build_array('cooking'));

์ธ์ž๋กœ target, path, new_value๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด target์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.(์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ์— ๊นŠ์ด ๋“ค์–ด๊ฐ€ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ)

๋งˆ์ง€๋ง‰ ์ธ์ž๋กœ๋Š” optional์ธ path์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ๋ถ€์žฌ์ผ ๋•Œ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” boolean ๊ฐ’์ด ์žˆ๋‹ค.

(true์ด๋ฉด ์ƒˆ path๋กœ ์ƒ์„ฑ, false๋ฉด ํ•ด๋‹นํ•˜๋Š” path๊ฐ€ ์—†์„ ๋•Œ ๊ทธ๋ƒฅ ๋ฌด์‹œ)

 

https://www.postgresql.org/docs/current/functions-json.html

 

9.16. JSON Functions and Operators

9.16. JSON Functions and Operators # 9.16.1. Processing and Creating JSON Data 9.16.2. The SQL/JSON Path Language 9.16.3. SQL/JSON Query Functions …

www.postgresql.org

 

'๐Ÿงฉ SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

SQL - SQL Injection  (0) 2026.04.09
SQL - PostgreSQL, Extensions  (0) 2026.04.06
SQL - PostgreSQL, DCL(Data Control Language)  (0) 2026.04.03
SQL - PostgreSQL, Transaction, Save Point, Isolation Level, Phenomena  (0) 2026.04.02
SQL - PostgreSQL, Extension(plpython3)  (0) 2026.04.02
'๐Ÿงฉ SQL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • SQL - SQL Injection
  • SQL - PostgreSQL, Extensions
  • SQL - PostgreSQL, DCL(Data Control Language)
  • SQL - PostgreSQL, Transaction, Save Point, Isolation Level, Phenomena
j2yonghwa
j2yonghwa
Trying to be a fullstack developer ๐Ÿš€
  • j2yonghwa
    j2yonghwa
    j2yonghwa
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (156)
      • โฐ Daily WakaTime (1)
      • ๐Ÿ–๏ธ ๋…ธ๋งˆ๋“œ์ฝ”๋” (2)
      • ๐Ÿบ Dev Setup (3)
      • ๐Ÿ”ญ Tech Info (1)
      • ๐Ÿšซ Error (1)
      • ๐Ÿ“‚ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (23)
      • ♣๏ธ Next.js 14 (10)
      • ♠๏ธ Next.js 12 (20)
      • ๐Ÿ›ธ React Native (12)
      • ๐Ÿฆ‹ TypeScript (1)
      • ๐Ÿ Python (2)
      • ๐ŸŒŠ TailwindCSS (4)
      • ๐Ÿงฉ SQL (25)
      • ๐Ÿ’Ž Prisma (5)
      • ๐ŸŒฑ MongoDB (4)
      • ๐ŸŽฏ Redis (1)
      • ๐Ÿงฌ GraphQL (2)
      • ๐Ÿ”ฅ Firebase (7)
      • ๐Ÿ’ธ Third-Party Services (2)
      • ๐Ÿ•ธ๏ธ Web (1)
      • ๐Ÿ† ์ฝ”๋”ฉํ…Œ์ŠคํŠธ (23)
      • ๐Ÿ“™ ๋ชจ๋”ฅ๋‹ค (5)
      • ๐Ÿ“— ์ฝ”ํ…Œ ํ•ฉ๊ฒฉ์ž ๋˜๊ธฐ -JS- (0)
      • ๐Ÿ“˜ ํด๋ฆฐ์ฝ”๋“œ (0)
      • ๐Ÿฏ ๊ฟ€ํŒ ๐Ÿ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

    • ๊นƒํ—™
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    react router
    SQL
    ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    Prisma
    next.js 12
    dev setup
    mongoDB
    tailwindcss
    ๋ชจ๋”ฅ๋‹ค
    Firebase
    PostgreSQL
    API
    Python
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์ž…๋ฌธ
    MySQL
    Next.js
    React Native
    0๋ ˆ๋ฒจ
    next.js 14
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
j2yonghwa
SQL - PostgreSQL, JSON Column
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”