Dra*_*gon 11 sql postgresql sql-update
我有一个包含列的表name,client_name和requester_name.我需要将这些列的值从"Mic"更新为"Michael".
以下是一些应该更新的记录:
name | client_name | requester_name
------+-------------+----------------
Mic | Jerry | Jack
Jack | Mic | Mic
Jerry | Jack | Mic
Run Code Online (Sandbox Code Playgroud)
我尝试了以下查询:
UPDATE names
SET name='Michael', client_name='Michael', requester_name='Michael'
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic';
Run Code Online (Sandbox Code Playgroud)
此查询使所有列都将所有名称更改为"Michael".
查询应该如何仅在适用的情况下应用更改?
Erw*_*ter 20
添加一个WHERE条款是明智的.
UPDATE names
SET name = CASE WHEN name = 'Mic' THEN 'Michael' ELSE name END
,client_name = CASE WHEN client_name = 'Mic' THEN 'Michael'
ELSE client_name END
,requester_name = CASE WHEN requester_name = 'Mic' THEN 'Michael'
ELSE requester_name END
WHERE 'Mic' IN (name, client_name, requester_name);
Run Code Online (Sandbox Code Playgroud)
否则,整个表格将无条件更新.将值更改为相同值的更新仍然是更新,从而创建死行,触发触发器等.虽然生成的行不会出错,但它仍会使表膨胀到其大小的两倍,这是VACUUM必要的,并且通常非常慢.
顺便说一下,这两种形式的CASE陈述都很好.
不是很优雅,也不是很有效,但在一个查询中:
UPDATE names SET
name = CASE name
WHEN 'Mic' THEN 'Micheal' ELSE name END,
client_name = CASE client_name
WHEN 'Mic' THEN 'Micheal' ELSE client_name END,
requester_name= CASE requester_name
WHEN 'Mic' THEN 'Micheal' ELSE requester_name END ;
Run Code Online (Sandbox Code Playgroud)
这使用CASE的缩写(Postgresql 特定)语法。
(顺便说一句:我猜你的意思是“迈克尔”而不是“迈克尔”?)
| 归档时间: |
|
| 查看次数: |
21789 次 |
| 最近记录: |