DB

[MySQL] (JSON4️⃣) WHERE 절에서 JSON 조건 처리하는 방법

인생아 2025. 7. 17. 19:30
반응형

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

 

반응형