Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果匹配项已经存在,如何将行号附加到行插入中?_Sql_Postgresql_Window Functions - Fatal编程技术网

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”的子句条目中缺少