首页 > 解决方案 > 如果匹配已经存在,如何将行号附加到行插入?

问题描述

我有一个带有电子邮件的用户表,例如:

johnsmith@gmail.com

我正在尝试使用可读条目批量更新用户的推荐代码。

我将将此代码设置为他们电子邮件的第一部分(在@符号之前),最多 12 个字符。

如果这些匹配项不止一个,例如:

johnsmith@gmail.comjohnsmith@aol.com,然后第二个将在末尾附加一个数字增量。

这应该导致推荐代码为:

johnsmith等等johnsmith1

现在,即使只有两个,我得到:

johnsmith1johnsmith2

理想情况下,如果只有一个条目,则不应附加任何数字。

我怎样才能做到这一点?

这是我目前拥有的:

  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
    ));

标签: sqlpostgresqlwindow-functions

解决方案


你的代码看起来很复杂:

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。它非常有用。


推荐阅读