昨日、SQL、または少なくともPostreSQLについて奇妙なことを発見しました。以下を見て、最初のクエリが何もせず、2 番目のクエリが適切に機能する理由を説明してください。
-- this silently does nothing
update bodycontent
set body = replace(body, '~' || u.oldusername, '~' || u.newusername)
from usermigration u;
-- this works as expected
update bodycontent
set body = replace(body, '~' || oldusername, '~' || newusername)
from usermigration u;
更新: 誰もがこの質問の要点を見逃していると思います。デカルト積は当初の意図でした。N x M の更新が予定されており、これは設計によるものです。
bodycontent の各行の移行テーブルに存在するすべてのユーザー名のペアを置き換える必要があります。
繰り返しますが、2 番目のバージョンは期待どおりに動作しますが、最初のバージョンは更新されません。私が知りたかったのは、その理由だけでした。
| usermigration table |
--------------------------
oldusername | newusersname
--------------------------
johndoe | johnd
john.smith | johnsmith
これは PostgreSQL のバグですか?