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 중국어 웹사이트의 기타 관련 기사를 참조하세요!