2011-12-07 3 views
20

저는 SQL을 처음 접했고 productID의 사용자 입력과 일치하는 전체 제품 목록을 얻으려고했습니다. 뭔가 같이 :INT 필드에서 LIKE 비교 수행

SELECT ProductID, ProductName FROM Products WHERE ProductID LIKE '%15%' 

나는 같은 일치하는 모든 제품을 목록에 싶습니다 15, 150, 2154 등 제품 ID 필드가 INT 때문에 불행하게도 내가 문제로 실행 해요

문자열이 아닙니다. 이 주변에 비교적 간단한 방법이 있습니까?

+1

"올바른"대답은 값을 텍스트로 변환/캐스팅하는 것이므로 열을 텍스트로 영구 변환하려면 테이블을 변경해야합니다. 이것은 제품 식별자에 대해 수학을 수행 할 필요가 없기 때문에 직관적입니다. – onedaywhen

답변

29

당신은 문자열로 필드를 CAST 수 있습니다

... WHERE CAST(ProductID as CHAR) LIKE '%15%' 

이 성능에 매우 나쁜, MySQL은 그것이 INT 열 생성 상관 없음 인덱스를 사용하지 수. 그러나 LIKE은 varchar 필드에서 수행되는 경우에도 항상 느립니다. LIKE 쿼리의 속도를 높이는 인덱스를 가질 방법이 없습니다.

int 열의 값을 반영하는 두 번째 varchar 열이 있으면 가치가있을 것입니다. 그리고 그 값에 대해 좋아하는 것 - 그것이 좋을 지 여부를 확인하기 위해 벤치 마크해야합니다.

+0

CONVERT를 사용하는 것보다 CAST를 사용하는 것이 더 빠릅니까? – Maxx

+1

@Maxx 그들은 같은 함수의 동의어이므로 아무런 차이가 없습니다. –

+0

{ "이 표현식에 정의되지 않은 함수 호출 CAST()가 포함되어 있습니다."}는 내가보고있는 것입니다 :( – Maxx

4

CONVERT(ProductID, CHAR(16)) AS ProductID을 사용하는 문자열에 convert int를 입력 한 다음 LIKE을 사용할 수 있습니다. 이

SELECT ProductID, ProductName FROM Products 
WHERE CONVERT(ProductID, CHAR(16)) LIKE '%15%' 

것입니다 귀하의 경우 그래서 당신은 쿼리가 인덱스로부터 어떤 지원도없이 전체 테이블 스캔을 할 것이라는 점을 기억해야한다. 결과적으로 비용이 많이 들고 시간이 많이 걸릴 것입니다.

+0

좀 더 구체적으로 기재 할 수 있습니까? 나는 일종의 멍청한 짓이야 :) 예를 들어 보자. – Maxx

+0

{ "이 표현식에는 정의되지 않은 함수 호출 CHAR()이 포함되어 있습니다."}는 내가보고있는 것입니다. – Maxx

+0

어떤 MySQL 버전을 사용하고 있습니까? – Jan