将一列的内容添加到另一列而不覆盖

时间:2018-10-25 12:05:06

标签: postgresql sql-update

我可以使用sql UPDATE轻松地将一列的内容复制到另一列。但是我需要在不删除现有内容的情况下执行此操作,因此从本质上讲,我想在不覆盖其他人原始内容的情况下向其附加一列。

我有一列称为笔记的列,然后由于一些未知的原因,几个月后,我添加了另一列称为product_notes,并在两天后意识到我有两套迫切需要合并的笔记。

通常,在做笔记时,我们只需使用表格将其添加到已有的任何笔记中即可。我需要像这样把这两列放在第一列中,例如

  

列注释=缺货Pete 040618 ---订购200件玉石   050618 --- 200个单位收到了莱拉080618

  

product_notes列=剩下5个单位Dave 120618 --- Dave 130618列表中注明的10107单元​​质量不合格

我需要将它们与---分隔符放在一起,而不会丢失第一列的内容,因此对于我的测试用例,结果必须像这样:

  

列注释=缺货Pete 040618 ---订购200件玉石   050618 ---收到200件Lila 080618 ---剩下5件Dave 120618 --- 10724部件的质量不符合Dave 130618的清单

2 个答案:

答案 0 :(得分:3)

@MaheshHViraktamath提供的解决方案很好,但是简单字符串串联的问题在于,如果串联的任何项目为NULL,则整个结果将为NULL。

另一个潜在的问题是,如果任一字段为空。在这种情况下,您可能会得到field a------field b的结果。

要防止出现第一种情况(不将检查放在WHERE子句中),可以像这样使用CONCAT_WS:CONCAT_WS('---', notes, product_notes)。这会将两个(或您放置在其中的许多字段)与第一个参数(即“ ---”)组合在一起。如果这两个字段中的任何一个为NULL,则不会使用分隔符,因此不会在分隔符之前或之后得到结果。

上述内容有两个问题:如果两个字段均为NULL,则结果不是NULL,而是空字符串。要处理这种情况,只需将其放在NULLIF中:NULLIF(CONCAT_WS('---', notes, product_notes), ''),以便在两个字段均为NULL的情况下返回NULL。

另一个问题是,如果任一字段为空,则分隔符仍将使用。为了防止这种情况发生(并且只有您会根据您的数据知道这是否是一种值得防范的情况,或者甚至需要这样做),请将每个字段也放入NULLIF中:NULLIF(CONCAT_WS('---', NULLIF(notes, ''), NULLIF(product_notes, '')), '')

结果,您得到:UPDATE your_table SET notes = NULLIF(CONCAT_WS('---', NULLIF(notes, ''), NULLIF(product_notes, '')), '');

答案 1 :(得分:2)

很简单-

update table1 set notes = notes || '---' || product_notes;