sql - 如果匹配已经存在,如何将行号附加到行插入?
问题描述
我有一个带有电子邮件的用户表,例如:
johnsmith@gmail.com
我正在尝试使用可读条目批量更新用户的推荐代码。
我将将此代码设置为他们电子邮件的第一部分(在@
符号之前),最多 12 个字符。
如果这些匹配项不止一个,例如:
johnsmith@gmail.com
和johnsmith@aol.com
,然后第二个将在末尾附加一个数字增量。
这应该导致推荐代码为:
johnsmith
等等johnsmith1
。
现在,即使只有两个,我得到:
johnsmith1
和johnsmith2
。
理想情况下,如果只有一个条目,则不应附加任何数字。
我怎样才能做到这一点?
这是我目前拥有的:
UPDATE auth.user_referral_codes
SET referral_code = CONCAT((
SELECT LEFT(LEFT(email, STRPOS(email, '@') - 1), 12)
FROM auth.users
WHERE id = auth.user_referral_codes.user_id
) , (
SELECT row_number FROM (
SELECT row_number()
OVER (
PARTITION BY (SELECT LEFT(LEFT(email, STRPOS(email, '@') - 1), 12))
)
FROM auth.users
WHERE id = auth.user_referral_codes.user_id
) as row_number_subquery
));
解决方案
你的代码看起来很复杂:
update auth.user_referral_codes urc
set referral_code = (left(left(email, strpos(email, '@') - 1), 12) ||
(case when seqnum > 1 then seqnum::text else '' end)
)
from (select u.*,
row_number() over (partition by left(left(email, strpo(email, '@') - 1), 12) order by user_id) as seqnum
from users u
) u
where urc.user_id = u.id;
Postgres 支持sFROM
中的子句UPDATE
。它非常有用。
推荐阅读
- c++ - 在 C++ 中两次删除指针
- rust - wasm rust base 64 支持
- android - Android İinterstitial Ad Navbar 出现问题
- android - 如何在发布应用程序后添加新内容并且用户在没有更新应用程序的情况下看到它们?
- sql-server - SSMA 在连接到 microsoft access 数据库时挂起
- javascript - 如何通过 jQuery 在本地存储中保存暗模式?
- java - 如果我在for循环中定义了两个循环变量,如何更新循环变量
- twilio - 如何在 Twilio 中的媒体流调用期间更改 TWIML
- python - 如何使用 spotify API 唤醒您的设备并获取设备 ID?
- c# - 如何从在 Linux(docker 容器)上运行的 c# .net 核心在远程 Windows 网络路径上运行 .exe