从SET字段中删除值的最佳方法是什么?

mor*_*di3 15 mysql sql sql-update

哪个是更新mysql SET字段的最佳方法,从字段中删除特定值.

例如.字段类别的值:1,2,3,4,5?我想从列表中删除'2':

UPDATE table 
SET categories = REPLACE(categories, ',2,', ',') 
WHERE field LIKE '%,2,%';
Run Code Online (Sandbox Code Playgroud)

但是,如果'2'是列表中的第一个或最后一个值,该怎么办?

UPDATE table 
SET categories = REPLACE(categories, '2,', '') 
WHERE field LIKE '2,%';

UPDATE table 
SET categories = REPLACE(categories, ',2', '') 
WHERE field LIKE ',2%';
Run Code Online (Sandbox Code Playgroud)

如何通过一个查询处理所有3个案例?!

fth*_*lla 24

如果您需要从集合中删除的值不能多次出现,您可以使用:

UPDATE yourtable
SET
  categories =
    TRIM(BOTH ',' FROM REPLACE(CONCAT(',', categories, ','), ',2,', ','))
WHERE
  FIND_IN_SET('2', categories)
Run Code Online (Sandbox Code Playgroud)

看到它在这里工作.如果该值可以多次出现,这将删除它的所有内容:

UPDATE yourtable
SET
  categories =
    TRIM(BOTH ',' FROM
      REPLACE(
        REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',')
    )
WHERE
  FIND_IN_SET('2', categories)
Run Code Online (Sandbox Code Playgroud)


pal*_*rom 6

update TABLE
set COLUMN = COLUMN & ~NUM
where COLUMN & NUM
Run Code Online (Sandbox Code Playgroud)

摘自评论部分:http://dev.mysql.com/doc/refman/5.0/en/set.html

请注意,NUM不是值'2',而是其内部索引.因此,如果您将字段定义为"set('1,'2','3','4','5')",则这些值的相应索引为(1,2,4,8,16).


Joh*_*Woo 5

最好的方法是不要在表上保存用逗号分隔的值。

但是要回答您的问题,您可以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)
Run Code Online (Sandbox Code Playgroud)

  • 为什么不在表上使用逗号分隔的值?在某些情况下,这可能比联接更快。 (2认同)
  • 在`field LIKE',2%'`上有一个小错字,应该是`field LIKE'%,2'`,我也用`WHERE FIND_IN_SET('2',field)`或`WHERE CONCAT(', ',field,',')就像'%,2,%'`一样,否则where条件也将匹配22 ...但这是一个不错的解决方案! (2认同)