반응형
mysql 숫자가 쉼표로 구분된 목록에 있는지 확인합니다.
저는 이런 테이블이 있습니다.
UID(int) NUMBERS(blob)
----------------------
1 1,13,15,20
2 3,10,15,20
3 3,15
그리고 NUMBER라는 blob에 3과 15가 있는지 테스트하고 싶습니다.그리고 LIKE %%를 사용할 수 없음을 알 수 있습니다.
ID가 2이고 3개인 행만 선택할 수 있습니다.
이 제품도 작동합니다.
SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)
IN을 사용하면 쉼표로 구분된 문자열을 볼 수 있습니다. 예를 들어 이 둘은
WHERE banana IN ('apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)
가장 예쁜 해결책은 아니지만, 효과는 있습니다.
select
UID
from
YOUR_TABLE
where
find_in_set('3', cast(NUMBERS as char)) > 0
and
find_in_set('15', cast(NUMBERS as char)) > 0
문자열 비교이므로 입력 매개 변수도 char에 캐스트해야 할 수 있습니다.
다음과 같이 시도해 볼 수 있습니다.
SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND FIND_IN_SET('15', NUMBERS)
이것이 누구에게나 도움이 되는지도 확인합니다.
네이티브의 한계를 없애기 위한 확장 기능FIND_IN_SET()
MySQL에서 이 새로운 확장 버전은FIND_IN_SET_X()
는 하나의 목록을 다른 목록과 비교할 수 있는 기능을 제공합니다.
예.
mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3
당신을 위한 기능이 완성됩니다.
DELIMITER $$
CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE limitCount INT DEFAULT 0 ;
DECLARE counter INT DEFAULT 0 ;
DECLARE res INT DEFAULT 0 ;
DECLARE temp TEXT ;
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ;
simple_loop :
LOOP
SET counter = counter + 1 ;
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ;
SET res = FIND_IN_SET(temp, targetList) ;
IF res > 0
THEN LEAVE simple_loop ;
END IF ;
IF counter = limitCount
THEN LEAVE simple_loop ;
END IF ;
END LOOP simple_loop ;
RETURN res ;
END$$
DELIMITER ;
find_in_set_x
mysql에서 새 함수를 만들고 다음에 붙여넣기(그런데 내 작업은 아님)
BEGIN
DECLARE limitCount INT DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE res INT DEFAULT 0;
DECLARE temp TEXT;
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',',''));
simple_loop:LOOP
SET counter = counter + 1;
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList,',',counter),',',-1);
SET res = FIND_IN_SET(temp,targetList);
IF res > 0 THEN LEAVE simple_loop; END IF;
IF counter = limitCount THEN LEAVE simple_loop; END IF;
END LOOP simple_loop;
RETURN res;
END
시도해 보기 쿼리:
SELECT UID FROM table WHERE NUMBERS REGEXP "[[:<:]](3|10)[[:>:]]"
[[:<:]],[[:>:]]:
이 마커들은 단어 경계를 의미하며, 따라서 단어의 시작과 끝을 각각 일치시킵니다.
다음을 시도해 봅니다.
SELECT UID
FROM TABLE
WHERE
concat(",",NUMBERS,",") like "%,1,%"
OR
concat(",",NUMBERS,",") like "%,15,%";
언급URL : https://stackoverflow.com/questions/2674011/mysql-check-if-numbers-are-in-a-comma-separated-list
반응형
'source' 카테고리의 다른 글
MariaDB에서 동적 열 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.10.09 |
---|---|
원격 세션에서 Powershell 로그오프 (0) | 2023.10.09 |
Linux의 C 프로그램에서 FS가 없는 하드 디스크에 직접 액세스 (0) | 2023.10.09 |
스프링 키클로크:사용자 ID 가져오기 (0) | 2023.10.09 |
기존 표에서 각 단어의 첫 글자를 대문자로 바꿉니다. (0) | 2023.10.09 |