2011-12-12 3 views
0

나는 이것이 FIND_IN_SET을 사용하여 수행 할 수 있음을 알고 있습니다. 그러나 나는 조금 다른 것을 필요로합니다.MySQL을 사용하여 CSV로 검색

내 한 필드에 쉼표로 구분 된 6 자리가 포함되어 있습니다. 그리고 다른 문자열은 쉼표로 구분 된 최대 5 개의 값을가집니다.

그래서 일치하는 값의 수를 얻고 싶습니다.

처럼 :

Database value: 1,2,3,4,5,6 
Search Value: 1,2,3,4 

이 이것은 내가 사용 2.

줄 것이다이 5

Database value: 1,2,3,4,5,6 
Search Value: 1,4 

을 줄 것이다 4.

Database value: 1,2,3,4,5,6 
Search Value: 1,2,3,4,6 

을 줄 것이다 InnoDB 테이블을 가지고있다.

답변

2

InnoDB 테이블을 사용하지 않았다면 어떤 설명에서 full text search을 사용할 것을 제안했을 것입니다. 하지만 InnoDB를 사용하고 있습니다!

그건 내가 특별히 user defined function의 경로를 따라 가게 될 것이라고 말했다. 운 좋게 나는 이미 previous post에서 일하고있다. 나는 당신이 어떤 구분자를 건네 줄 수 있도록 그것을 비틀었다. 함수이기 때문에 다른 MySQL 함수처럼 쿼리에서 사용할 수 있습니다.

희망이 있습니다.

DROP FUNCTION IF EXISTS `CompareStrings`; 

DELIMITER $$ 

CREATE FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255), delimiter VARCHAR(1)) RETURNS double 
READS SQL DATA 
BEGIN 
DECLARE cur_position INT DEFAULT 1 ; 
DECLARE remainder TEXT; 
DECLARE cur_string VARCHAR(255); 
DECLARE delimiter_length TINYINT UNSIGNED; 
DECLARE total INT; 
DECLARE result DOUBLE DEFAULT 0; 
DECLARE string2 VARCHAR(255); 

SET remainder = str1; 
SET string2 = concat(delimiter,trim(str2),delimiter); 
SET delimiter_length = CHAR_LENGTH(delimiter); 
SET cur_position = 1; 

WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO 
    SET cur_position = INSTR(remainder, delimiter); 
    IF cur_position = 0 THEN 
     SET cur_string = remainder; 
    ELSE 
     SET cur_string = concat(delimiter,LEFT(remainder, cur_position - 1),delimiter); 
    END IF; 
    IF TRIM(cur_string) != '' THEN 
     set result = result + (select instr(string2,cur_string) > 0); 
    END IF; 
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length); 
END WHILE; 

RETURN result; 

END$$ 

DELIMITER ; 
당신은 다음과 같이 실행할 수 있습니다

:

select CompareStrings('1,2,3,4,5,6','1,2,3,4',',') 

을하고 4를 얻을 것이다 :

select CompareStrings('1,2,3,4,5,6','1,2,3,4,6',',') 

를 당신은 얻을 것이다 5

0

나는 1 만든 함수이고 1은 mysql 사이트에서 찾을 수 있습니다 :

이 함수는 정의 된 구분 기호가있는 문자열의 주어진 위치에 값이 제공됩니다.

DELIMITER $$ 

CREATE FUNCTION `SplitString`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET latin1 
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '') 

이 함수는 위의 함수를 사용하여 내 용도로 사용됩니다.

DELIMITER $$ 

CREATE FUNCTION `get_matched`(my_num varchar(100), to_match_num VARCHAR(100)) RETURNS int(11) 
BEGIN 

DECLARE temp, total INT; 
SET total=0; 
SET temp = IF(FIND_IN_SET(SplitString(my_num,',',1), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',2), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',3), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',4), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',5), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',6), to_match_num)>0,1,0); 
SET total = total+temp; 

RETURN total; 
END 
관련 문제