> 데이터 베이스 > MySQL 튜토리얼 > FIND_IN_SET() 대 IN(): 언제 쉼표로 구분된 값에 각각을 사용해야 합니까?

FIND_IN_SET() 대 IN(): 언제 쉼표로 구분된 값에 각각을 사용해야 합니까?

DDD
풀어 주다: 2024-12-25 21:35:16
원래의
898명이 탐색했습니다.

FIND_IN_SET() vs. IN(): When Should I Use Each for Comma-Separated Values?

FIND_IN_SET() 대 IN(): 쿼리 수수께끼 공개

데이터베이스 쿼리 영역에서 서로 다른 기능 간의 뉘앙스를 이해하는 것은 중대한. FIND_IN_SET()과 IN()을 비교할 때, 특히 쉼표로 구분된 문자열로 저장된 값을 쿼리할 때 이러한 차이가 발생합니다.

쿼리 불일치

두 테이블을 고려해보세요. 쉼표로 구분된 회사 식별자와 "회사"를 포함하는 "attachedCompanyIDs" 열이 있는 "orders" "companyID" 열과 해당 회사 이름이 있습니다. 다음 쿼리는 FIND_IN_SET()을 사용하여 주문과 관련된 회사 이름을 효과적으로 검색합니다.

SELECT name
FROM orders, company
WHERE orderID = 1
AND FIND_IN_SET(companyID, attachedCompanyIDs)
로그인 후 복사

그러나 IN()을 사용하는 유사한 쿼리는 예상치 못한 결과를 낳습니다.

SELECT name
FROM orders, company
WHERE orderID = 1
AND companyID IN (attachedCompanyIDs)
로그인 후 복사

숨겨진 함정

근본 원인은 MySQL이 쉼표로 구분된 항목을 처리하는 방식에 있습니다. AttachedCompanyID를 정수로 캐스팅할 때의 값입니다. 캐스트는 숫자가 아닌 첫 번째 숫자를 잘라내어 문자열을 첫 번째 쉼표로 구분된 값으로 효과적으로 줄입니다.

예를 들어 attachmentCompanyID가 '1,2,3'으로 설정된 경우 IN() 쿼리가 잘못되었습니다. 됩니다:

companyID IN (1)
로그인 후 복사

이것은 IN() 쿼리가 첫 번째 회사 이름만 반환하는 반면 FIND_IN_SET()은 모든 회사 이름을 반환하는 이유를 설명합니다. three.

제한 극복

이 문제를 해결하려면 쉼표로 구분된 문자열을 적절하게 처리하는 대체 접근 방식을 고려하세요. PostgreSQL에서는 배열을 사용할 수 있습니다.

SELECT name
FROM orders
JOIN company
ON companyID = ANY(('{' || attachedCompanyIDs || '}')::INT[])
WHERE orderID = 1
로그인 후 복사

안타깝게도 MySQL에서는 배열이 지원되지 않습니다. 제한된 수의 값(예: 5개 미만)의 경우 교차 조인 및 문자열 조작을 사용하여 해결 방법이 가능합니다.

SELECT name
FROM orders
CROSS JOIN
(
SELECT 1 AS pos
UNION ALL
SELECT 2 AS pos
UNION ALL
SELECT 3 AS pos
UNION ALL
SELECT 4 AS pos
UNION ALL
SELECT 5 AS pos
) q
JOIN company
ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
로그인 후 복사

위 내용은 FIND_IN_SET() 대 IN(): 언제 쉼표로 구분된 값에 각각을 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿