代码之家  ›  专栏  ›  技术社区  ›  Neil Knight

更新查询?或者其他解决方案?

  •  1
  • Neil Knight  · 技术社区  · 14 年前

    我有一个电子邮件列,其中包含无效地址,例如“xxx@hotmail.co.uk,xxx@hotmail.co.uk”。(包括引文)

    我的select语句清理这些:

    SELECT SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
    FROM table
    WHERE [Email] LIKE ‘”%”’
    

    工作和显示:xxx@hotmail.co.uk

    我遇到的问题是,我有许多格式不正确的记录,我需要用上面select查询的结果更新它们。有什么主意吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Damien_The_Unbeliever    14 年前
    UPDATE table
    SET [Email] = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
    WHERE [Email] LIKE ‘”%”’
    

    事先确保这个类似的表达是 只有 匹配这些有问题的电子邮件地址,就不会拾取其他具有不同值的行。

        2
  •  2
  •   Simone Margaritelli    14 年前
    UPDATE table SET 
        [Email] = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2)) 
    WHERE 
        [Email] LIKE ‘”%”’
    
        3
  •  2
  •   KM.    14 年前

    为了确保您不会丢失任何有效的电子邮件,请保存更改的电子邮件:

    CREATE TABLE ChangedEmails
    (
    PK ...
    Email ...
    )
    

    然后修复电子邮件并保存更改的电子邮件(在一个语句中)

    UPDATE YourTable
        SET Email=SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2)) 
        OUTPUT INSERTED.PK,DELETED.Email
            INTO ChangedEmails
    WHERE 
        Email LIKE ‘”%”’
    

    现在,如果有任何疑问,你可以看到之前的电子邮件是什么,你改变他们。

    另外,根据OPS的评论:

    这就是我想出来的但是我得到了 PK违规密钥,所以我想我需要 查找导致此问题的行。 谢谢!

    不要把pk设为电子邮件地址!! 使用标识作为pk,并使电子邮件仅成为数据列。用这个来“修复”你的桌子:

    ALTER TABLE YourTable ADD YourPKID int NOT NULL IDENTITY (1, 1)
    GO
    
    ALTER TABLE YourTable DROP CONSTRAINT PK_YourTable
    GO
    
    ALTER TABLE dbo.JobApps ADD CONSTRAINT
        PK_YourTable PRIMARY KEY CLUSTERED 
        (
        YourPKID 
        ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO
    
        4
  •  1
  •   AdaTheDev    14 年前
    UPDATE table
    SET Email = SUBSTRING([Email], 2, PATINDEX(‘%,%’, [Email] – 2))
    WHERE [Email] LIKE ‘”%”’
    

    应该会成功的。当然,先在测试数据上测试一下:)

        5
  •  1
  •   D'Arcy Rittich    14 年前

    你可以用 UPDATE 这样的陈述:

    update table 
    set Email = SUBSTRING(Email, 2, PATINDEX('%,%', Email – 2)) 
    WHERE Email LIKE '"%"'