我有一个用户表,其中包含一封电子邮件,例如:[email protected]
我正在尝试用一个可读的条目批量更新用户的推荐代码。
我将把这个代码设置为他们电子邮件的第一部分(在@
符号之前),最多12个字符。
如果有多个匹配项,例如:[email protected]
和[email protected]
,则第二个将在末尾附加一个数字增量。
这将导致转诊代码为: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支持
FROM
s中的UPDATE
子句,这非常有用。关于sql - 如果匹配已经存在,如何在行号上附加行号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52080339/