Sì, se c'è la possibilità puoi mettere entrambi last, first
e first last
nel database, il modo migliore è progettare correttamente lo schema.
Se mai ti ritrovi a cercare o manipolare in altro modo parti di colonne, il tuo schema è quasi sicuramente rotto. Quasi sicuramente ucciderà le prestazioni.
Il modo corretto è avere la tabella così:
T1 FirstName LastName
== ========= ========
1 Pax Diablo
2 Bob Smith
3 George Jones
Quindi puoi dividere in modo più efficiente il nome inserito dall'utente (una volta, prima di eseguire la query) piuttosto che provare a dividere ogni singolo nome nel database.
Nel caso in cui il database contiene sempre last, first
, potrebbe non essere effettivamente necessario per una modifica dello schema.
Il problema che hai in quel caso è semplicemente quello di interpretare ciò che l'utente ha inserito.
Una possibilità, sebbene sia un killer di prestazioni, è fare un like
per ogni singola parola. Quindi, se l'utente ha inserito pax diablo
, la tua query risultante potrebbe essere:
select T1 from mytable
where T2 like '%pax%'
and T2 like '%diablo%'
In questo modo, non ti importa molto dell'ordine.
Tuttavia, data la mia antipatia per le query lente, cercherei di evitarlo a meno che non sia assolutamente necessario (o il tuo database è relativamente piccolo e probabilmente rimarrà tale).
Esistono molti modi per velocizzare questo tipo di query, ad esempio:
- utilizzando qualsiasi capacità di ricerca full-text di cui dispone il tuo DBMS.
- emulazione di tali abilità estraendo e memorizzando parole durante i trigger di inserimento/aggiornamento (e rimuovendoli durante i trigger di eliminazione).
- quel caso precedente, ma assicurando anche colonne aggiuntive utilizzate con valori minuscoli della colonna corrente (per la velocità).
- comunicando all'utente che deve utilizzare
last, first
modulo per la ricerca. - cercando di evitare il
%something%
stringa di ricerca il più possibile (consomething%
, gli indici possono ancora essere utilizzati). - il mio metodo "dividi il nome in due colonne" menzionato in precedenza.