반응형
MySQL에서 JSON 타입을 WHERE 절에 사용하는 건
처음엔 낯설지만 익숙해지면 강력한 쿼리를 만들 수 있다.

✅ JSON 필드에서 특정 키가 존재하는지 확인
JSON_CONTAINS_PATH() 함수를 사용해 키 존재 여부를 확인할 수 있다.
SELECT *
FROM users
WHERE JSON_CONTAINS_PATH(profile, 'one', '$.email');
- 'one': 하나라도 존재하면 true
- 'all': 모두 존재해야 true
- $.email: 확인할 JSON 경로
✅ 유저 프로필에 특정 정보가 있는지 필터링할 때 유용
반응형
🔍 특정 값이 포함됐는지 확인
JSON_CONTAINS()는 배열 안에 값이 있는지, 객체에 부분 구조가 포함됐는지를 체크한다.
-- 배열에 값 포함 여부
SELECT *
FROM products
WHERE JSON_CONTAINS(tags, '"electronics"');
-- 객체 안에 key-value 쌍이 있는지
SELECT *
FROM settings
WHERE JSON_CONTAINS(config, '{"theme":"dark"}');
✅ 문자열은 반드시 큰따옴표로 감싸야 한다 ("값" 형태)
🔎 특정 값이 정확히 일치하는 경우
JSON_EXTRACT() 또는 -> 연산자를 WHERE 절에서 그대로 쓸 수 있다.
SELECT *
FROM users
WHERE JSON_EXTRACT(profile, '$.name') = '"홍길동"';
또는 ->>로 문자열 비교도 가능
SELECT *
FROM users
WHERE profile->>'$.name' = '홍길동';
✅ 문자열 비교는 ->> 또는 JSON_UNQUOTE()가 더 편하다
📑 숫자 조건 필터링도 가능
SELECT *
FROM users
WHERE profile->>'$.age' >= '30';
주의할 점: JSON 내부의 숫자도 문자열로 취급될 수 있으므로 비교 시 형 변환을 고려해야 한다
-- 문자열 비교이기 때문에 정확한 캐스팅이 필요
SELECT *
FROM users
WHERE CAST(profile->>'$.age' AS UNSIGNED) > 30;
🔁 LIKE 검색도 가능
SELECT *
FROM users
WHERE profile->>'$.email' LIKE '%@gmail.com';
✅ UNQUOTE 처리가 된 값이기 때문에 LIKE로 패턴 검색 가능
반응형
🧠 실무 예제
-- 설정값 중 push 알림이 true인 유저만 조회
SELECT *
FROM users
WHERE profile->>'$.push_enabled' = 'true';
-- 관심 카테고리에 'sports'가 포함된 사용자
SELECT *
FROM users
WHERE JSON_CONTAINS(profile->'$.interests', '"sports"');
-- 특정 key만 존재하는 사용자 필터링
SELECT *
FROM users
WHERE JSON_CONTAINS_PATH(profile, 'one', '$.marketing_opt_in');
📌 정리
| 사용 함수 | 용도 |
| JSON_CONTAINS_PATH | 특정 키 존재 여부 |
| JSON_CONTAINS | 값 또는 구조 포함 여부 |
| JSON_EXTRACT / -> | 값 추출 |
| ->> / JSON_UNQUOTE | 문자열 비교 또는 LIKE 검색 |
JSON은 유연하지만 느릴 수 있다.
자주 조회되는 필드는 일반 컬럼으로 따로 분리해두는 것이 성능상 유리하다.
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법 (1) | 2025.07.18 |
|---|---|
| [MySQL] (GIS1️⃣) GIS란? 공간 데이터 타입(POINT, POLYGON 등) 완전 정리 (1) | 2025.07.18 |
| [MySQL] (JSON6️⃣) 실무에서 JSON 타입을 쓸 때 주의할 점 (4) | 2025.07.17 |
| [MySQL] (JSON5️⃣) JSON 쿼리 성능 튜닝 전략: 인덱싱과 최적화 팁 (0) | 2025.07.17 |
| [MySQL] (JSON3️⃣) JSON_EXTRACT, JSON_UNQUOTE, JSON_CONTAINS 파헤치기 (0) | 2025.07.17 |
| [MySQL] (JSON2️⃣) JSON_INSERT, JSON_SET, JSON_REPLACE 실전 활용법 (0) | 2025.07.17 |
| [MySQL] (JSON1️⃣) JSON 타입이란? 구조와 활용 예제 정리 (0) | 2025.07.17 |
| [MySQL] (고가용성4️⃣) Group Replication vs MHA 실무 비교와 선택 가이드 (0) | 2025.07.17 |