用相同的字符串替换替换多个字符串

时间:2020-05-14 23:05:33

标签: sql-server replace sql-update

过去一直在寻找这个,我不认为嵌套替换是答案。我有一个我需要保持唯一性的电子邮件地址列表,但我需要将它们全部设为伪造以便进行测试。因此,我的想法是将“ .com”,“。net”,“。org”等替换为“ .mydomain.com”。但是总共有很多结尾。

我意识到我可以删除@并在其末尾添加'@ mydomain.com',但是现在我也想弄清楚如何解决这个特殊问题。

代替:

BEGIN TRANSACTION; 
UPDATE Customer
  SET Email=REPLACE(Email, '.com','.mydomain.com')
where email not like '%.mydomain.com%'
COMMIT TRANSACTION;

每种情况下的'.com','。net','。org'........

有没有办法说,在一个语句中用“ .mydomain.com”替换所有这些(“ .com”,“。net”,“。org”)?

类似这样的东西。

BEGIN TRANSACTION; 
UPDATE Customer
  SET Email=REPLACE(Email, (in ('.com', '.net', '.org')),'.mydomain.com')
where email not like '%.mydomain.com%'
COMMIT TRANSACTION;

4 个答案:

答案 0 :(得分:1)

遵循KISS原则,只需运行3个独立的查询。

update Customer set email = replace(email, '.com', '.mydomain.com') where email not like '%.mydomain.com%';
update Customer set email = replace(email, '.net', '.mydomain.com') where email not like '%.mydomain.com%';
update Customer set email = replace(email, '.org', '.mydomain.com') where email not like '%.mydomain.com%';

答案 1 :(得分:0)

我认为类似的事情应该起作用。

UPDATE Customer
  SET Email (case 
      where CHARINDEX(Email, '.com') > 0 then REPLACE(Email, '.com','.mydomain.com')
      where CHARINDEX(Email, '.net') > 0 then REPLACE(Email, '.net','.mydomain.com')
      where CHARINDEX(Email, '.org') > 0 then REPLACE(Email, '.org','.mydomain.com')
      end)
where email not like '%.mydomain.com%'

可以用任何验证字符串是否包含子字符串的函数代替CHARINDEX

答案 2 :(得分:0)

另一种解决方案是使用嵌套的replace语句:

update Customer set email = replace(replace(email, '.com', '.mydomain.com'), '.net', '.mydomain.com')

您可以根据需要继续选择多个级别。您甚至可以动态生成替换语句。

另一种可能的解决方案是使用存储过程。

答案 3 :(得分:0)

您可以使用echo '<ul><li>'.$title1.'</li>'; echo '<li>'.$content1.'</li>'; echo '<li>'.$answer1.'</li></ul>'; 来联接要替换的TLD的派生表。 (如果有,您也可以将“真实”表与TLD联接在一起。)

                  $qtitle =$_GET['id'];

                  $sql ="select Q1.title, Q1.content, Q1.answer from questionset_question as Q2";
                  $sql .=" inner join question as Q1 on Q1.question_id=Q2.question_id inner join questionset as Q3";
                  $sql .=" on Q3.questionset_id=Q2.questionset_id where Q3.title='$qtitle'";

                  if ($result = $db->query($sql)) { 
                      while ($row = $result->fetch_assoc()) {   
                        $title1=$row['Q1.title'];
                        $content1=$row['Q1.content'];
                        $answer1=$row['Q1.answer'];

                        echo '<ul><li>'.$title1.'</li>';
                        echo '<li>'.$content1.'</li>';   
                        echo '<li>'.$answer1.'</li></ul>'; 
                      }

                      $result->free();
                    }
                    else {
                      echo "no result";
                    }

computed attribute constructor

尽管这样,如果与TLD匹配的子字符串位于末尾的其他位置,则无法解决问题。但这可能不是问题。