programing

MySQL 쿼리 쉼표로 구분된 문자열에서 값 찾기

firstcheck 2022. 10. 29. 14:41
반응형

MySQL 쿼리 쉼표로 구분된 문자열에서 값 찾기

나는 밭이 있다.COLORS (varchar(50))내 테이블에서SHIRTS다음과 같은 쉼표로 구분된 문자열을 포함합니다.1,2,5,12,15,. 사용 가능한 색상을 나타내는 각 숫자.

쿼리를 실행할 때select * from shirts where colors like '%1%'모든 빨간 셔츠(color=1)를 구입하려면 회색(=12)과 주황색(=15)의 셔츠도 구입합니다.

숫자 1을 포함하는 모든 색상이 아닌 색상 1만을 선택하도록 쿼리를 다시 작성하려면 어떻게 해야 합니까?

일반적인 방법은 왼쪽과 오른쪽에 쉼표를 추가하는 것입니다.

select * from shirts where CONCAT(',', colors, ',') like '%,1,%'

그러나 find_in_set도 작동합니다.

select * from shirts where find_in_set('1',colors) <> 0

경우 FIND_IN_SET은 당신의 친구입니다.

select * from shirts where FIND_IN_SET(1,colors) 

FIND_를 참조해 주세요.MySQL의 IN_SET 함수.

SELECT * 
    FROM shirts 
    WHERE FIND_IN_SET('1',colors) > 0

이것은 확실히 동작합니다만, 실제로 사용해 보았습니다.

lwdba@localhost (DB test) :: DROP TABLE IF EXISTS shirts;
Query OK, 0 rows affected (0.08 sec)

lwdba@localhost (DB test) :: CREATE TABLE shirts
    -> (<BR>
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ticketnumber INT,
    -> colors VARCHAR(30)
    -> );<BR>
Query OK, 0 rows affected (0.19 sec)

lwdba@localhost (DB test) :: INSERT INTO shirts (ticketnumber,colors) VALUES
    -> (32423,'1,2,5,12,15'),
    -> (32424,'1,5,12,15,30'),
    -> (32425,'2,5,11,15,28'),
    -> (32426,'1,2,7,12,15'),
    -> (32427,'2,4,8,12,15');
Query OK, 5 rows affected (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 0

lwdba@localhost (DB test) :: SELECT * FROM shirts WHERE LOCATE(CONCAT(',', 1 ,','),CONCAT(',',colors,',')) > 0;
+----+--------------+--------------+
| id | ticketnumber | colors       |
+----+--------------+--------------+
|  1 |        32423 | 1,2,5,12,15  |
|  2 |        32424 | 1,5,12,15,30 |
|  4 |        32426 | 1,2,7,12,15  |
+----+--------------+--------------+
3 rows in set (0.00 sec)

시험해 보세요!!!

색상 세트가 다소 고정된 경우, 가장 효율적이고 읽기 쉬운 방법은 앱에서 문자열 상수를 사용하고 MySQL을 사용하는 것입니다.SET을 타이핑하다.FIND_IN_SET('red',colors)를 참조해 주세요.를 사용하는 경우SETFIND_로 입력합니다.IN_SET, MySQL은 1개의 정수를 사용하여 모든 값을 저장하고 바이너리를 사용합니다."and"콤마로 구분된 문자열을 스캔하는 것보다 훨씬 효율적인 값의 존재 여부를 확인하는 작업입니다.

SET('red','blue','green'),'red'로서 내부에 저장될 것이다.1,'blue'로서 내부에 저장될 것이다.2그리고.'green'로서 내부에 저장될 것이다.4. 값'red,blue'로 저장될 것이다.3(1|2)와'red,green'~하듯이5(1|4).

select * from shirts where find_in_set('1',colors) <> 0

효과가 있다

MySQL을 사용하는 경우 사용할 수 있는 REGEXP 메서드가 있습니다.

http://dev.mysql.com/doc/refman/5.1/en/regexp.html#operator_regexp

그 후 다음을 사용합니다.

SELECT * FROM `shirts` WHERE `colors` REGEXP '\b1\b'

실제로 데이터베이스 스키마를 수정하여 다음 3개의 테이블을 확보해야 합니다.

shirt: shirt_id, shirt_name
color: color_id, color_name
shirtcolor: shirt_id, color_id

그리고 빨간색 셔츠를 모두 찾으려면 다음과 같은 질문을 해야 합니다.

SELECT *
FROM shirt, color
WHERE color.color_name = 'red'
  AND shirt.shirt_id = shirtcolor.shirt_id
  AND color.color_id = shirtcolor.color_id

다음과 같은 기능을 통해 이를 달성할 수 있습니다.

다음 쿼리를 실행하여 함수를 만듭니다.

DELIMITER ||
CREATE FUNCTION `TOTAL_OCCURANCE`(`commastring` TEXT, `findme`     VARCHAR(255)) RETURNS int(11)
NO SQL
-- SANI: First param is for comma separated string and 2nd for string to find.
return ROUND (   
    (
        LENGTH(commastring)
        - LENGTH( REPLACE ( commastring, findme, "") ) 
    ) / LENGTH(findme)        
);

그리고 이 함수를 이렇게 부릅니다.

msyql> select TOTAL_OCCURANCE('A,B,C,A,D,X,B,AB', 'A');

1. MySQL의 경우:

SELECT FIND_IN_SET(5, columnname) AS result 
FROM table

2. Postgres SQL의 경우:

SELECT * 
FROM TABLENAME f
WHERE 'searchvalue' = ANY (string_to_array(COLUMNNAME, ','))

select * 
from customer f
where '11' = ANY (string_to_array(customerids, ','))

모든 답변이 정확하지는 않습니다. 다음을 시도해 보십시오.

select * from shirts where 1 IN (colors);

언급URL : https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string

반응형