Come detto da oregon, temo ci sia un misunderstanding... non ho riferimenti sul dialetto SQL di Access, ma una funzione del genere esiste ad esempio in SQLite, e quel codice sarebbe assolutamente corretto. Per ogni record, il DBMS prende il contenuto del campo campo ed elimina tutti i punti prima di confrontarlo con la clausola like. Ovvero, ovviamente non opera sul nome del campo, ma sul suo contenuto (come qualunque funzione che si possa richiamare in SQL).
Amaro C++, il gusto pieno dell'undefined behavior.
Appunto! MItaly, mi hai appena dato ragione!![]()
Infatti la regola è che:
prende il contenuto del campo campo
La questione NON E' se la funzione Replace() esista o meno; ci mancherebbe altro che dopo 15 anni di programmazione non la conoscessi!!!
Il problema è che NON E' POSSIBILE usarla in quel modo, e francamente trovo davvero strano che nessuno se ne sia accorto.
Stellinaxxx la usa facendo il Replace sul NOME del campo della tabella, NON sul contenuto del campo; il che non ha senso.
Ammesso, e non concesso, che in Access puoi scrivere i nomi dei campi come ti pare basta che poi nelle query questi siano inclusi tra parentesi quadre, non ha comunque senso fare il Replace sul nome del campo, lo si deve fare sul contenuto.
Questa non è un'opinione. E' un fatto.
Tra l'altro, poi, è lo stesso stellinaxxx che afferma di volerla usare per tale scopo:
solo che la stringa SQL riportata è sbagliata.
Suggerirei di prestare più attenzione a quello che si legge, e si scrive.
È esattamente quello che vuole fare, come ribadito più volte; nel primo post ammetto che era poco chiaro e anch'io non avevo ben capito, ma poi si è chiarita perfettamente.
È ben quello che sta facendo! Infatti se specifichi il nome di un campo (che in Access, come in praticamente ogni altro DBMS, si può specificare senza quadre, se questo non introduce ambiguità) nella clausola WHERE, questo viene interpretato come il contenuto di quel campo sul record che è correntemente in esame; ma queste sono le basi di SQL, che so per certo che conosci a menadito, per cui non capisco da dove nasca l'equivoco (specie quando già in quattro ti abbiamo fatto notare che hai preso un abbaglio sull'uso che intende fare di quella query).Ammesso, e non concesso, che in Access puoi scrivere i nomi dei campi come ti pare basta che poi nelle query questi siano inclusi tra parentesi quadre, non ha comunque senso fare il Replace sul nome del campo, lo si deve fare sul contenuto.
stellinaxxx vuole fare una specie di fuzzy-matching sul contenuto di una certa colonna; ovvero, nel DB in una certa colonna i nomi di diverse organizzazioni (sparo a caso) sono memorizzati con i punti tra le lettere delle sigle (ad esempio S.p.A., A.S.L., U.S.L.), e vuole che la ricerca matchi anche quando l'utente inserisce, come stringa da cercare, l'equivalente senza punti (SpA, ASL, USL). Per fare questo invece di fare un confronto del tipoTra l'altro, poi, è lo stesso stellinaxxx che afferma di volerla usare per tale scopo:
(dove campo è una colonna di NomeTabella)codice:select * from NomeTabella where campo like '%valore%'
vuole fare
ovvero, ad essere confrontato tramite la like non è il contenuto della colonna campo "così come è memorizzato nel DB", ma per ogni record il confronto avviene tra '%valore%' e il contenuto del campo campo "epurato" dai punti.codice:select * from NomeTabella where replace(campo,'.', '') like '%valore%'
Non posso che essere d'accordo con questo suggerimento.Suggerirei di prestare più attenzione a quello che si legge, e si scrive.
In ogni caso, incidente chiuso, si torna in-topic, altrimenti non ne usciamo più.
Ultima modifica di MItaly; 10-10-2013 a 20:24
Amaro C++, il gusto pieno dell'undefined behavior.