Sql 如果匹配项已经存在,如何将行号附加到行插入中?
我有一个带有电子邮件的用户表,如:Sql 如果匹配项已经存在,如何将行号附加到行插入中?,sql,postgresql,window-functions,Sql,Postgresql,Window Functions,我有一个带有电子邮件的用户表,如: johnsmith@gmail.com 我正在尝试使用可读条目批量更新用户的推荐代码 我会将此代码设置为他们电子邮件的第一部分(在@符号之前),最多12个字符 如果有多个匹配项,例如: johnsmith@gmail.com和johnsmith@aol.com,则第二个将在末尾附加一个数字增量 这应导致转介代码为: johnsmith和johnsmith1等 现在,即使只有两个,我得到: johnsmith1和johnsmith2 理想情况下,如果只有一个条目
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支持
UPDATE
s中的FROM
子句。这是非常有用的。对戈登·林诺夫的答案稍加修改,就可以做到:
UPDATE auth.user_referral_codes urc
SET referral_code = (
LEFT(LEFT(email, strpos(email, '@') - 1), 12)
|| (CASE WHEN seqnum > 1 THEN (seqnum-1)::TEXT ELSE '' END)
)
FROM (
SELECT
auth.users.*,
row_number() OVER (
PARTITION BY LEFT(LEFT(email, strpos(email, '@') - 1), 12)
ORDER BY id
) AS seqnum
FROM auth.users
) AS u
WHERE urc.user_id = u.id;
这看起来是一个很酷的解决方案。现在我返回:
错误:表“u”的子句条目中缺少