2009-06-16 10 views

Respuesta

18

Puede buscar REGEXP con MySQL, pero, por desgracia, no puede devolver la pieza coincidente.

Es posible hacerlo con SQL de la siguiente manera:

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

se puede omitir la cláusula WHERE, pero podría conducir a resultados inesperados (como @example.xxx.com será reemplazado por @example.yyx.com), por lo que es mejor dejar eso.

0

no el registro, ya que no tienen instalado MySQL, pero parece que le podría ayudar a

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

PS. Regexp no lo ayudará con la actualización, ya que solo puede ayudarlo a ubicar la entrada específica de la subcadena en la cadena o verificar siempre que la cadena coincida con el patrón. Here puede encontrar referencias a funciones relevantes.

2

Preferiría hacerlo con PHP, si es posible. Mysql lamentablemente no permite capturar partes coincidentes en expresiones regulares. O mejor aún: puede combinar las dos cosas de este tipo, por ejemplo:

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

Tenga en cuenta que esta solución tomará bastante tiempo y que puede quedarse sin memoria o golpear los límites de ejecución si tiene muchas entradas en la base de datos . Es posible que desee consultar ignore_user_abort() y ini_set() para cambiar el límite de memoria de este script.

Descargo de responsabilidad: ¡Script not tested! No lo use sin entender/probar el código (podría estropear su db).

3
UPDATE tableName 
SET email = CONCAT(SUBSTRING(email, 1, locate('@',email)), 'domain.yy') 
WHERE email REGEXP '@domain.xx$'; 
Cuestiones relacionadas