0

我有查询的新问题:

我想根据 id 使用一些新数据更新列“column”:

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

从数据库中获取数据时会导致一些问题,因为当我explode()它时,它会使第一个数组值为空。我想在更新表格时删除这样的第一个逗号。我想我应该做一些'if'语句来检查'column'的长度(使用char_length),如果它是空的更新而没有首先,以逗号开头。你能帮我正确的语法吗?

摘要:如果存在“列”,如何使用以逗号开头的值进行更新列的正确查询。如果 'column' 为空,则使用变量更新它而不用逗号开头。

4

2 回答 2

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那么你会遇到 NULL 的问题column

另请注意,我放弃了你else的支持 WHERE 子句,不要更新超过你需要的。

于 2012-03-04T22:24:19.873 回答
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(..,..,..)

于 2012-03-04T22:16:03.900 回答