【问题标题】:How can I append on a row number on to a row insertion if a match already exists?如果匹配已经存在,如何将行号附加到行插入?
【发布时间】:2018-08-29 14:46:15
【问题描述】:

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

johnsmith@gmail.com

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

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

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

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

这应该导致推荐代码为:

johnsmithjohnsmith1

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

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

【问题讨论】:

    标签: sql postgresql window-functions


    【解决方案1】:

    你的代码看起来很复杂:

    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 在UPDATEs 中支持FROM 子句。挺好用的。

    【讨论】:

    • 这看起来是一个很酷的解决方案。现在我要回来了:error: missing FROM-clause entry for table "u"
    【解决方案2】:

    稍微调整一下 Gordon Linoff 的回答,就可以了:

      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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      相关资源
      最近更新 更多