2010-04-25 15 views
26

Qual è il modo migliore per eseguire una query in modo che gli spazi nei campi siano ignorati? Ad esempio, le seguenti query:Query che ignora gli spazi

SELECT * FROM mytable WHERE username = "JohnBobJones"  
SELECT * FROM mytable WHERE username = "John Bob Jones" 

avrebbero trovato le seguenti voci:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

Sto usando PHP o Python, ma penso che questo non ha importanza.

+1

PostgreSQL o MySQL? La soluzione migliore potrebbe essere diversa in ciascun caso. Cercando di scrivere qualcosa che funziona in entrambi è di solito una ricetta per una query lenta. –

risposta

54
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '') 
+0

funziona perfettamente anche in firebird2.5. – lordvlad

+0

È inoltre possibile utilizzare la funzione REPLACE() con operatori LIKE e caratteri jolly. Ad esempio: SELECT * FROM mytable REPLACE (nome utente, '', '') LIKE REPLACE ("John B%", '', ''); –

-1

Un modo sarebbe utilizzare LIKE e WildCards per creare la tua query citeria. Qualcosa di simile:

SELEZIONA * FROM mytable DOVE nome utente LIKE 'John Bob Jones';

+15

Questo corrisponderà in modo errato a 'John Paul Bob Jones'. – SLaks

+0

Questa risposta è sbagliata. –

10

Dipende. Se non ti importa delle buone prestazioni, ci sono molte cose che potresti fare ma la maggior parte di esse sarà lenta. Forse è giusto per te, ma lascerò questa risposta qui nel caso in cui altri lettori volessero una soluzione veloce.

Se si desidera prestazioni molto veloci, è necessario indicizzare la stringa senza spazi nel database. In PostgreSQL puoi create an index on a function. È possibile utilizzare questo per creare un indice sulla colonna con spazi sostituiti con la stringa vuota. Il vantaggio di questo metodo è che non richiede manutenzione a parte la creazione dell'indice.

In MySQL non è possibile fare così il modo più semplice sarebbe quello di duplicare i dati nel database - una volta con spazi e una volta senza. Utilizzare la colonna senza spazi nella clausola WHERE, ma la colonna originale nell'elenco di colonne SELECT. Ciò richiede più manutenzione in quanto le colonne devono essere mantenute sincronizzate. È possibile farlo con la logica dell'applicazione o i trigger del database.

+0

buon punto, ho appena provato mySQL REPLACE in una ricerca di codice postale e wow ... è lento ... grazie per il suggerimento! – Ford

1

provate questo:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '') 
+0

Non riuscirebbe a trovare 'JohnBob Jones' – Alan

2

La soluzione proposta sembrano molto bene, ma è orribile per le prestazioni, se è possibile limitare la query con qualcosa come

SELECT * FROM tabella dove username come 'John %' e sostituire (nome utente, '', '') = REPLACE ("John Bob Jones", '', '')

Inoltre è possibile utilizzare REGEXP.

SELECT * FROM tabella dove username REGEXP '^ John * * Bob Jones'

E ricordate le prestazioni, funzionamento in cui sono in cattiva idea generale.

Date un'occhiata a http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

spesso si vuole cercare il testo, a prescindere dal numero di spazi, spazi bianchi e le lettere.

Basta tagliare, in minuscolo e sostituire tutti i caratteri multipex senza parole per uno spazio.

SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 

ritorno: ecco un testo lungo con molti spazi bianchi e carattere diverso sensibili

Qui è l'uso per la ricerca. Solo l'ordine delle parole è importante, niente di più. E questo è bello.

select * from (
SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 
) as o 
where t= regexp_replace(trim(lower('Here is a LonG  TEXT , with   mANY white ^ spaces   AND   different character    sensiTive')),'\W+',' ','g') 

ritorno: ecco un testo lungo con molti spazi bianchi e carattere diverso sensibili

immondizia nei dati e spazzatura nella query, ma trova ancora nel modo giusto.

Problemi correlati