[SQL] SET 필드에서 값을 제거하는 가장 좋은 방법은?
SQLSET 필드에서 값을 제거하는 가장 좋은 방법은?
어떤 분야에서 특정 값을 제거하기 위해, MySQL의 SET 필드를 업데이트하는 가장 좋은 방법입니다.
예. 값 범주 필드 : 1,2,3,4,5를? 나는 목록에서 '2'를 제거하려면 :
UPDATE table
SET categories = REPLACE(categories, ',2,', ',')
WHERE field LIKE '%,2,%';
그러나 경우 '2'첫 번째 또는 목록에서 마지막 값 무엇인가?
UPDATE table
SET categories = REPLACE(categories, '2,', '')
WHERE field LIKE '2,%';
UPDATE table
SET categories = REPLACE(categories, ',2', '')
WHERE field LIKE ',2%';
어떻게 하나 개의 쿼리 3 사건을 처리 할 수있다?!
해결법
-
==============================
1.당신이 세트에서 제거 할 필요가 값이 한 번 이상 존재하지 않을 경우, 당신은이를 사용할 수 있습니다 :
당신이 세트에서 제거 할 필요가 값이 한 번 이상 존재하지 않을 경우, 당신은이를 사용할 수 있습니다 :
UPDATE yourtable SET categories = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', categories, ','), ',2,', ',')) WHERE FIND_IN_SET('2', categories)
여기에 작업을 참조하십시오. 값이 한 번 이상 존재할 수 있다면, 이것은 그것의 모든 occourences을 제거합니다 :
UPDATE yourtable SET categories = TRIM(BOTH ',' FROM REPLACE( REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',') ) WHERE FIND_IN_SET('2', categories)
-
==============================
2.
update TABLE set COLUMN = COLUMN & ~NUM where COLUMN & NUM
http://dev.mysql.com/doc/refman/5.0/en/set.html :의 코멘트 섹션에서 촬영
하지만 조심, NUM은 값 '2'하지만 내부 인덱스가 아닙니다. 그래서 당신이 좋아하는 분야를 정의하면 "설정 ( '1,'2 ','3 ','4 ','5 ')"다음이 값의 해당 인덱스 (1,2,4,8,16)입니다.
-
==============================
3.가장 좋은 방법은 값이 테이블에 쉼표 (,)로 구분 저장하지 않는 것입니다.
가장 좋은 방법은 값이 테이블에 쉼표 (,)로 구분 저장하지 않는 것입니다.
그러나 귀하의 질문에 대답하기 위해, 당신은이에 CASE를 사용할 수 있습니다
UPDATE table SET categories = CASE WHEN field LIKE '%,2,%' -- In the middle THEN REPLACE(categories, ',2,', ',') WHEN field LIKE '2,%' -- At the beginning THEN REPLACE(categories, '2,', '') WHEN field LIKE '%,2' -- At the end THEN REPLACE(categories, ',2', '') WHEN field = '2' -- At whole THEN '' END WHERE FIND_IN_SET('2', categories)
-
==============================
4.다음은이 일을하는 또 다른 방법은 다음과 같습니다
다음은이 일을하는 또 다른 방법은 다음과 같습니다
UPDATE table SET categories = CONCAT_WS(',', IF(FIND_IN_SET('1', categories), '1', NULL), -- Note that '2' is missing here! IF(FIND_IN_SET('3', categories), '3', NULL), IF(FIND_IN_SET('4', categories), '4', NULL), IF(FIND_IN_SET('5', categories), '5', NULL) );
그들이 NULL이 아닌 경우 CONCAT_WS는 첫 번째 인수 (인수 1을 제외한) 모든 인수 (이 경우 ',') 연결합니다. 필드를 포함하지만 (이 경우 2) 우리가 제거 할 하나를 건너 뛸 경우 우리는 SET 필드의 각 가능한 값을 찾습니다. 그렇다면, 우리는 그 값, 그렇지 않으면 NULL을 반환합니다. 이는 SET 필드에 대한 새 값을 재구성, 우리가 삭제하려는 하나를 건너 뛰는 ','로 설정 한 모든 값을 연결합니다.
이것은 물론에만 작동합니다, 당신은 종류의 가능한 모든 값을 알고 있지만, 이것은 SET 필드이기 때문에, 당신이 알고있는 경우.
-
==============================
5.나는 비트 연산자를 사용하는 것이 가장 깨끗한 방법이 될 것을 찾을 수 있습니다. 당신이 끄려면이 계산에게 비트를 사용할 수 있도록 FIND_IN_SET ()의 반환 값은 값의 위치를 반환합니다.
나는 비트 연산자를 사용하는 것이 가장 깨끗한 방법이 될 것을 찾을 수 있습니다. 당신이 끄려면이 계산에게 비트를 사용할 수 있도록 FIND_IN_SET ()의 반환 값은 값의 위치를 반환합니다.
UPDATE table SET categories = CAST(categories AS UNSIGNED) & ~POW(2, FIND_IN_SET('2', categories)) WHERE FIND_IN_SET('2', categories);
즉, (카테고리 + 0)의 정수로 설정 전류 값을 강제로 참고. 당신은이 중복 찾을 수 있지만, 값이 많이 포함 된 세트에주의 할 수있다. 난 당신이 명시 적으로 정수로 설정을 강제하지 않는 경우 결과 수학이 잘못 될 수 있다는 것을 발견 -이 같은 작업을 수행 할 때 당신은 분명히 잘못된 값을 원하지 않는다.
-
==============================
6.나는 크리스 Gielen (https://blog.krisgielen.be/archives/255)에 의해이 방법을 좋아한다 :
나는 크리스 Gielen (https://blog.krisgielen.be/archives/255)에 의해이 방법을 좋아한다 :
UPDATE table SET categories = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', categories, ','), CONCAT(',', '2', ','), ',')) WHERE ...
세트에 값을 추가하려면 :
UPDATE table SET categories = CONCAT_WS(',', categories, '2') WHERE ...
from https://stackoverflow.com/questions/14642658/the-best-way-to-remove-value-from-set-field by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 내 SQL 데이터베이스에 많은 관계로 하나를 저장? (MySQL의) (0) | 2020.05.23 |
---|---|
[SQL] MySQL은 사용자 로그인을 못하게 : 오류 1524 (0) | 2020.05.23 |
[SQL] 어떻게 CodeIgniter의 내 SQL 쿼리를 실행합니다 (0) | 2020.05.22 |
[SQL] 열 등 여러 행을 가입 MYSQL (0) | 2020.05.22 |
[SQL] T-SQL 건너 뛰기는 저장 프로 시저를 가지고 가십시오 (0) | 2020.05.22 |