我的查询有新问题:
我想根据id使用一些新数据更新列'列':
UPDATE table SET column = CASE
WHEN id = 2 THEN CONCAT(`column`, ',7')
WHEN id = 3 THEN CONCAT(`column`, ',10')
ELSE column
END;
不幸的是,向列添加新值必须在开头有一个逗号,因为列将数据存储为逗号分隔值。 例如,它看起来像这样:
id | column
-------------
2 | 3, 1, 20
3 | 1, 5
执行查询后,我得到:
id | column
-------------
2 | 3, 1, 20, 7
3 | 1, 5, 10
直到现在,这一切都很好。不幸的是,如果我更新空的列,它都以逗号开头,它看起来像这样:
id | column
-------------
2 | ,7
3 | ,10
当我从db中获取数据时会导致一些问题,因为当我爆炸它时,它会使第一个数组值为空。我想在更新表时删除这些第一个逗号。 我想我应该制作一些“if”语句来检查'column'的长度(使用char_length),如果它是空的更新,而不是先启动逗号。 你能用正确的语法帮助我吗?
要点: 如果“列”存在,如何使用以逗号开头的值进行如上所述更新列的正确查询。如果'column'为空,则使用变量更新它而不启动逗号。
答案 0 :(得分:2)
正确的方法是不在列中使用CSV,使用单独的关联表。然后你只需要在关联表中插入或删除行,就不会有任何问题。
但是,如果您必须坚持使用当前架构,那么您可以这样做:
update table
set column = case
when id = 2 then concat(column, if(coalesce(column, '') = '', '7', ',7'))
when id = 3 then concat(column, if(coalesce(column, '') = '', '10', ',10'))
end
where id in (2, 3)
如果您不包含coalesce
,则会遇到column
中的NULL问题。
另请注意,我删除了else
以支持WHERE子句,不要更新超过您需要的内容。
答案 1 :(得分:1)
这个怎么样:
UPDATE table SET column = CASE
WHEN id = 2 THEN CONCAT(`column`, IF( CHAR_LENGTH(column)=0, '', ',' ), '7' )
WHEN id = 3 THEN CONCAT(`column`, IF( CHAR_LENGTH(column)=0, '', ',' ), '10')
ELSE column
END;
MySQL的参考手册:CHAR_LENGTH(..)和IF(..,..,..)。