programing

스위치 내부에 LIKE가 있는 MySQL의 선택 쿼리

bestprogram 2023. 10. 14. 10:25

스위치 내부에 LIKE가 있는 MySQL의 선택 쿼리

이 태그 테이블이 있습니다.

CREATE TABLE IF NOT EXISTS `Tags` (
   `id_tag` int(10) unsigned NOT NULL auto_increment,
   `tag` varchar(255) default NULL,
   PRIMARY KEY  (`id_tag`),
   UNIQUE KEY `tag` (`tag`),
   KEY `id_tag` (`id_tag`),
   KEY `tag_2` (`tag`),
   KEY `tag_3` (`tag`),
   KEY `tag_4` (`tag`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2937 ;

INSERT INTO `Tags` (`id_tag`, `tag`) VALUES
   (1816, '(class'),
   (2642, 'class\r\n\r\nâ?¬35'),
   (1906, 'class\r\nif'),
   (1398, 'class'),
   (2436, 'class)'),
   (1973, 'class:\n1.'),
   (2791, 'classes'),
   (1325, 'New'),
   (2185, 'pack'),
   (1905, 'packed'),
   (1389, 'WebClass');

태그가 키워드와 일치하는 모든 레코드를 가져오겠습니다.class아니면pack아니면new, 태그 필드와 실제로 일치하는 3개의 키워드 중 어떤 것이 있는지를 나타내는 다른 필드와 함께.

다음 쿼리는 올바른 결과를 제공하지 않습니다 쿼리 1

select id_tag,
case tag 
   when tag LIKE "%class%" then "class" 
   when tag LIKE "%new%" then "new"
   when tag LIKE "%pack%" then "pack"
end as matching_tag 
from Tags 
where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%"

저는 케이스 안에 비슷한 것을 사용해야 합니다.그렇지 않으면 완전 일치가 작동합니다.다음 쿼리가 작동합니다. -

쿼리 2

select id_tag,
case tag 
   when "class" then "class" 
   when "new" then "new"
   when "pack" then "pack"
end as matching_tag 
from Tags 
where tag = "class" OR tag = "new" OR tag = "pack"

쿼리 1에 무슨 문제가 있습니까?제발 도와주세요.

Mysql은 두 가지 변형의 경우를 지원합니다. 쿼리 2에서 사용하는 경우는 유연성이 떨어지지만 단일 변수에 대해서만 동일성을 지원합니다.다른 버전은 대소문자를 구분하지 않고 조건만 같을 필요는 없습니다.

select id_tag,
case  
   when tag LIKE "%class%" then "class" 
   when tag LIKE "%new%" then "new"
   when tag LIKE "%pack%" then "pack"
end as matching_tag 
from Tags 
where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%"

자세한 내용은 설명서 참조

편집: 쿼리 #1이 반환된 내용을 반환한 이유에 대한 설명을 조금 더 드리겠습니다.

case tag
   when tag LIKE "%class%" then "class" 
   when tag LIKE "%new%" then "new"
   when tag LIKE "%pack%" then "pack"
end as matching_tag

비교를 위해 리터럴 값을 얻을 것으로 예상합니다.when ... then위의 경우 표현들은tag LIKE "%class%",tag LIKE "%new%"그리고.tag LIKE "%pack%"실제 사례를 비교하기 전에 모두 평가합니다.그러나 (!), 이 값이 0 또는 1이 되고 태그 값과 비교할 때 첫 번째 값인 0은 모든 문자(char는 0으로 캐스팅됨)와 일치합니다. 이 값은 첫 번째 쿼리의 결과와 일치합니다.

다음은 관련 식에 대한 논리적 값을 보여주는 쿼리입니다.

select id_tag, tag LIKE "%class%", tag LIKE "%new%", tag = 0, case tag     when tag LIKE "%class%" then "class"     when tag LIKE "%new%" then "new"    when tag LIKE "%pack%" then "pack" end as matching_tag  from Tags  where tag LIKE "%class%" OR tag LIKE "%new%" OR tag LIKE "%pack%";

그래서 예상치 못한 결과를 얻게 됩니다. 조용한 CAST는 여기서 표준 함정입니다.

다른 조항에 대해 상기시키고 싶습니다.

case  
   when tag LIKE "%class%" then "class" 
   when tag LIKE "%new%" then "new"
   when tag LIKE "%pack%" then "pack"
   else "no one"
end as matching_tag 

언급URL : https://stackoverflow.com/questions/3082894/switch-with-like-inside-select-query-in-mysql