Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581

    [mySQL] Sostituire testo con regexp

    Ho la necessità di fare una sorta di pulizia in determinati campi di un db, il tutto per ottenere delle stringhe che contengano solo lettere.

    Ho cercato in rete (impazzendo un po') e se ho ben capito non è possibile fare un regexp_replace direttamente, quindi l'unica alternativa è creare una funzione.

    Ho iniziato quindi a scriverla, ma mi da un errore che non capisco, qualcuno mi aiuta?

    codice:
    create function pulisci(str VARCHAR(255))
    returns VARCHAR(255) deterministic
    return REPLACE(str, REGEXP('[^a-z0-9]'), '');
    in pratica vorrei prima lanciare una select di verifica e, successivamente, lanciare l'update dei campi
    Se proprio non si può fare sarò costretto a far girare uno script php .. il problema è che ho oltre 5000 record da aggiornare e ho paura che l'operazione vada in timeout

    grazie

  2. #2
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    All'inizio dici di voler lasciare solo le lettere ma nel codice che hai postato sembrerebbe voglia preservare sia lettere che numeri.
    Cosa vuoi fare esattamente? Devi lasciare anche gli spazi eventualmente presenti tra una parola e l'altra o sono stringhe di un'unica parola?

    Le espressioni regolari di mysql non consentono di fare la sostituzione. Quindi o ricorri a php oppure occorre una funzione che cicli le stringhe carattere per carattere rimuovendo quelli indesiderati.

    A questo indirizzo

    http://www.mysqludf.org/lib_mysqludf_preg/index.php

    tempo fa avevo trovato un plugin per aggiungere un migliore supporto delle espressioni regolari ma confesso di non essere riuscito a farlo funzionare.

  3. #3
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    si scusa, si trattava di tenere solo lettere e numeri

    alla fine ho testato con php e, effettivamente, ci mette molto meno tempo di quanto avevo previsto ... quindi senza impazzire mi sa che do tutto in pasto alla mia funzione pulisci() fatta ad hoc

    pensavo che in mysql scrivendo una funzione si riuscisse a fare questa cosa che non è possibile con le istruzioni di base

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Originariamente inviato da Fichico
    pensavo che in mysql scrivendo una funzione si riuscisse a fare questa cosa che non è possibile con le istruzioni di base
    Infatti si può fare. Bisogna scriversi una funzioncina che cicli tutti i caratteri della stringa rimuovendo quelli indesiderati come ti ho già scritto.

  5. #5
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    ma secondo te è più veloce dar tutto in pasto in php o far eseguire la funzione da mysql?
    in questo caso come andrebbe modificata la mia funzione?

    io dovrei tenere tutta la stringa minuscola, con numeri e lettere ma solo non accentate

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    Immagino sia più veloce l'uso delle regexp in php. Bisognerebbe testare su un grosso campione di record per vedere le differenze.

    Stasera magari ti scrivo la funzioncina per fare la stessa cosa direttamente in mysql.

  7. #7
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581
    se riesci ti ringrazio un sacco, ma senza impazzire mi raccomando

    alla fine ho l'altra opzione, era solo per velocizzare operazoni di modifiche strutturali ad un db senza rishciare timeout di php dato che ho un sacco di dati che varieranno

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,922
    codice:
    delimiter //
    
    create function LettereNumeri(str varchar(50)) returns varchar(50)
    no sql
    begin
    declare verifica varchar(50);
    declare risultato varchar(50) default '';
    declare carattere varchar(2);
    declare i integer default 1;
    
    if char_length(str) > 0 then
    	while(i <= char_length(str)) do
    		set carattere = substring(str,i,1);
    		set verifica = find_in_set(binary(carattere),'0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,y,x,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,Y,X,Z');
    		
    		if verifica > 0 then
    			set risultato = concat(risultato,carattere);
    		end if;
    
    		set i = i + 1;
    
    	end while;
    
    return lower(risultato);
    else
    return '';
    end if;
    end //
    
    delimiter ;
    Provala prima in forma di select

    codice:
    select campo_iniziale,letterenumeri(campo_iniziale) as modificato from tabella

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.