这可能是一个重复的问题,但我找不到解决问题的好方法。
我在Postgres中只有这样的一行:
username | date | status | account_id | last_update | account_type | iban | email | business_name
--------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
tMCjBPQjE+9C | 17-05-12 | CANCELLED | axFOU38iBWRnfcAW11H7lg== | 16:42:17.962 | B | |
我希望你能看到,有些专栏没有该字段。 现在完美,我的问题是: 如果我想更新该行,并且假设我所拥有的行没有account_id值但是状态不同,所以我需要更新它。更新的结果将是更新状态字段,以及account_id,它将为空。那是我的问题。 我不想更新已填充信息的字段,但仅在实际更改时才更新。这需要是动态的,因为我不知道哪些字段将是空的或不是,但我所知道的是,如果该字段已经存在,那么它很好,如果新行不包含则不能更新它。
因此,例如,此行是与PK(USERNAME AND DATE)匹配的行,其状态与已存储在表中的行不同。
username | date | status | account_id | last_update | account_type | iban | email | business_name
--------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
tMCjBPQjE+9C | 17-05-12 | NEW | | 16:42:17.962 | B | |
如您所见,上面的行具有不同的状态,密钥用户名和日期匹配,所以我需要更新!但是在更新中,字段account_id不能更新,因为我已经有了一个值,已经存在了!
这必须对表中的每个元素都有效,所以假设下一行有email, iban
字段而不是account_id
,我需要更新我没有的字段但是不要碰我已经拥有的那个。
对于前一个示例,输出应该是:
username | date | status | account_id | last_update | account_type | iban | email | business_name
--------------------------+----------+---------------------+--------------------------+--------------+--------------+----------------------------------------------+----------------------------------------------+----------------------------------------------
tMCjBPQjE+9C | 17-05-12 | NEW | axFOU38iBWRnfcAW11H7lg== | 16:42:17.962 | B | |
现在,这是我的政治家,它可能与预期不同,因为我正在使用Logstash输出插件来执行UPSERT功能。
INSERT INTO users VALUES(?,?,?,?,?,?)
on conflict (username,date)
do update set (date,status, firstname, lastname, last_update) = (?,?,?,?,?)
where users.username = ? "
, "%{[request][username]}","%{date}","%{status}", "%{firstname}", "%{lastname}","%{time}","%{date}","%{status}", "%{firstname}", "%{lastname}","%{time}","%{[request][username]}"
每个?
的映射方式是第一个?
为"%{[request][username]}"
,第二个是"%{date}"
等等。此语句有效,它执行更新和插入但是当我按照我的描述进行更新时,并没有做我想要的“动态”工作。
对不起,如果我没有解释清楚,请告诉我你是否需要进一步澄清这个问题。