스위치 내부에 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
'programing' 카테고리의 다른 글
세 개의 테이블에서 세는 방법은? (0) | 2023.10.14 |
---|---|
Spring Security Expressions에서 정적 메서드를 호출합니까? (0) | 2023.10.14 |
데이터 프레임에서 열 순서를 지정하여 그룹(사분위수, 분위수 등)을 신속하게 구성하는 방법 (0) | 2023.10.14 |
Panda 열 바인딩(cbind) 데이터 프레임 두 개 (0) | 2023.10.14 |
리눅스 커널 버전을 확인할 수 있는 매크로 정의가 있습니까? (0) | 2023.10.14 |