복붙노트

[SQL] SET 필드에서 값을 제거하는 가장 좋은 방법은?

SQL

SET 필드에서 값을 제거하는 가장 좋은 방법은?

어떤 분야에서 특정 값을 제거하기 위해, 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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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 ...
    
  7. from https://stackoverflow.com/questions/14642658/the-best-way-to-remove-value-from-set-field by cc-by-sa and MIT license