3

我正在尝试使用同一张表的某些字段的 CONCAT 更新我的表的一个字段。

有了这个

UPDATE tabex SET field1=CONCAT(tabex.a1,', ',tabex.a2,', ',tabex.a3,', ',tabex.a4,', ',tabex.a5,', ',tabex.a6,', 'tabex.a7,', ',tabex.a8,', ',tabex.a9 );

此查询有 0 行受到影响并且没有错误。

有了这个其他查询

UPDATE tabex SET field1=CONCAT_WS(tabex.a1,', ',tabex.a2,', ',tabex.a3,', ',tabex.a4,', ',tabex.a5,', ',tabex.a6,', 'tabex.a7,', ',tabex.a8,', ',tabex.a9 );

如果某些 a(n) 字段的内容为 NULL,mysql 会复制上一个结果

有人可以帮助我吗?

4

1 回答 1

5

当这个查询

UPDATE tabex SET field1=CONCAT(tabex.a1,', ',tabex.a2,', ',tabex.a3,', ',tabex.a4,', ',tabex.a5,', ',tabex.a6,', 'tabex.a7,', ',tabex.a8,', ',tabex.a9 );

不影响一行,唯一的解释是,表是空的。它将更新表中的每一行。但如果其中一列为 NULL,则您的 field1 列也将为 NULL。
为避免这种情况,您必须使用 COALESCE() 函数。此函数返回其第一个非 NULL 参数。

UPDATE tabex SET field1=CONCAT(COALESCE(tabex.a1, ''),', ',...);

在旁注中,我不得不问,你为什么要这样做。大多数情况下,列中的逗号分隔值是个坏主意。

最后,您使用 CONCAT_WS() 的查询是错误的。函数名中的_WS是“with separator”的缩写,所以第一个参数是分隔符,然后放在函数的其他参数之间。所以你应该这样写:

UPDATE tabex SET field1=CONCAT_WS(',', tabex.a1, tabex.a2, tabex.a3,...);

CONCAT_WS() 函数的另一个优点是它忽略 NULL 值。阅读手册中有关这两个功能的更多信息。

于 2013-11-07T13:18:42.487 回答