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)
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).
最好的方法是不要在表上保存用逗号分隔的值。
但是要回答您的问题,您可以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)