Find_in_set() 대 IN(): 차이점 이해
MySQL에서는 FIND_IN_SET() 및 IN() 연산자가 중요한 역할을 합니다. 테이블에서 데이터를 쿼리할 때. 둘 다 값 집합의 멤버십을 테스트하는 데 사용할 수 있지만 특정 시나리오를 처리하는 방법이 다릅니다.
주문과 관련된 회사 이름을 검색하는 것을 목표로 하는 다음 쿼리를 고려하세요.
SELECT name FROM orders, company WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
이 쿼리는 Company 1, Another Company 및 StackOverflow의 세 회사 이름을 모두 성공적으로 산출합니다. 그러나 FIND_IN_SET()을 IN()으로 바꾸면 예상치 못한 결과가 발생합니다.
SELECT name FROM orders, company WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
이 경우 첫 번째 회사 이름인 Company 1만 반환됩니다. 그 이유를 이해하려면 이러한 연산자의 기본 메커니즘을 이해하는 것이 중요합니다.
FIND_IN_SET()
FIND_IN_SET()은 쉼표 내의 특정 값에 대한 문자 검색을 수행합니다. -구분된 문자열. 이 경우 attachmentCompanyIDs에는 '1,2,3'과 같은 문자열이 포함되어 있습니다. FIND_IN_SET()은 이 문자열 내에서 대상 값(1, 2 또는 3)의 위치를 반환하거나, 찾을 수 없는 경우 0을 반환합니다.
IN()
IN ()는 반면에 대상 값과 비교할 값 목록을 기대합니다. 그러나 MySQL에서 attachmentCompanyIDs는 배열이나 목록이 아닌 스칼라 값입니다. 따라서 MySQL은 IN() 비교를 위해 이 스칼라 문자열을 정수(회사 ID 유형)로 캐스팅하려고 시도합니다.
캐스트하는 동안 MySQL은 문자열의 첫 번째 쉼표('1,2,3')를 해석합니다. )를 숫자 부분의 끝으로 사용하여 정수 값 1이 됩니다. 본질적으로 IN() 조건은 사실상 다음과 같습니다.
companyID IN (1)
이것은 왜 첫 번째 회사만 이름인 Company 1이 검색됩니다. IN() 조건은 쉼표로 구분된 문자열의 첫 번째 값에 대해서만 true입니다.
해결책
쉼표 안의 값 개수가 다음과 같다고 가정하는 경우 -구분된 목록은 제한되어 있으므로 이러한 시나리오를 효과적으로 처리하기 위해 대체 접근 방식을 사용할 수 있습니다.
위 내용은 MySQL의 FIND_IN_SET()과 IN() 비교: 각각은 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!