2009-06-16 8 views

답변

18

MySQL으로 검색 할 수 있지만, 불행히도 일치하는 부분을 반환 할 수 없습니다. 다음과 같이

SQL와 함께 할 수있다 :

UPDATE mytable 
SET  email = REPLACE(email, '@domain.xx', '@domain.yy') 
WHERE email REGEXP '@domain.xx$' 

당신은 WHERE 절을 생략 할 수 있지만 예상치 못한 결과가 발생할 수 있습니다 (같은 @example.xxx.com@example.yyx.com로 대체됩니다)가 떠나 더 나은 그래서, 그것.

0

는 MySQL의 설치되어 있지 않기 때문에, 그것을 확인하지만, 그것은 당신에게

update table_name 
set table_name.email = substr(table_name.email, 0, position("@" in table_name.email) + 1) 
         + "new_domain"; 

PS 도움이 될 것 같습니다하지 않았다. 문자열이 패턴과 일치 할 때마다 문자열에서 문자열의 특정 입구를 찾는 데 도움이되기 때문에 Regexp는 업데이트에 도움이되지 않습니다. Here 관련 기능에 대한 참조를 찾을 수 있습니다.

2

가능한 경우 PHP로 처리하는 것이 좋습니다. MySQL은 유감스럽게도 정규 표현식에서 일치하는 부분을 캡처하는 것을 허용하지 않습니다. 또는 더 나은 : 당신은 예를 들어, 다음과 같은 두 가지를 결합 할 수 있습니다 : 당신이 당신의 데이터베이스에 여러 항목이있는 경우 실행 제한이 솔루션은 꽤 시간이 좀 걸릴 것입니다 그리고 당신은 메모리가 부족하거나 공격

$emails = fetchAllDistinctEmailsIntoAnArray(); 
# Make the array int-indexed: 
$emails = array_values($emails); 
# convert the mails 
$replacedEmails = preg_replace('/xx$/', 'yy', $emails); 
# create a new query 
$cases = array(); 
foreach ($emails as $key => $email) { 
    # Don't forget to use mysql_escape_string or similar! 
    $cases[] = "WHEN '" . escapeValue($email) . 
       "' THEN '" . escappeValue(replacedEmails[$key]) . "'"; 
} 
issueQuery(
    "UPDATE `YourTable` 
    SET `emailColumn` = 
     CASE `emailColumn`" . 
      implode(',', $cases) . 
     " END CASE"); 

하는 것으로 . 이 스크립트의 메모리 제한을 변경하는 방법은 ignore_user_abort()ini_set()입니다.

면책 조항 : 스크립트 테스트를 거치지 않았습니다! 코드를 이해/테스트하지 않고 사용하지 마십시오 (db가 엉망이 될 수 있음).

3
UPDATE tableName 
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy') 
WHERE email REGEXP '@domain.xx$'; 
관련 문제