Thx Kyle and Conor, i finally dit that s = session.query(Contact.IdContact, Contact.Civilite, Contact.Nom, Contact.Prenom, ContactTel.Tel).filter(ContactTel.IdContact==Contact.IdContact).filter(Contact.IdDossier==self.dossierPourChargement.IdDossier) # s = s.filter(ContactTel.Tel.like(NumeroApparu)) s = s.filter(ContactTel.Tel.op("regexp")("(.)*".join(list(NumeroApparu))) )
i construct a regular expression from the telephone number and do the regexp search sql 2009/10/14 Kyle Schaffrick <k...@raidi.us> > > On Mon, 12 Oct 2009 13:47:19 -0500 > Conor <conor.edward.da...@gmail.com> wrote: > > > > > Christian Démolis wrote: > > > Hi, > > > > > > The idea of creating another column is good but it will multiplicate > > > the size of my table by 2 for nothing. Is it possible to use MYSQL > > > regular expression search with sql alcmehy? If yes, what is the > > > command? > > > > > MySQL supports RLIKE/REGEXP operators; you can see how to use them in > > SQLAlchemy in this thread: > > > http://groups.google.com/group/sqlalchemy/browse_thread/thread/7c6abe2ab9d5061 > > > > Be aware that regexp matching cannot utilize indexes, so you may have > > performance problems. > > > > If you want to get fancy, you can try creating an index on the > > expression REPLACE(REPLACE(<tel_column>, ' ', ''), '.', '') > > which should create an index on the normalized phone numbers. In > > theory, as long as your queries use the exact same function sequence > > as the index, the index will be scanned instead of the full table. I > > don't know what limitations MySQL has in this regard. Even if it does > > work, the only real advantage it provides over using another column > > is the normalized form is "hidden" in the index instead of the table. > > > > Hope it helps, > > -Conor > > > > Indeed this problem is easily solved with expression indexes (a.k.a. > "functional" or "calculated" indexes). Unfortunately MySQL does not > appear to support them. Their suggested workaround is to add a column to > store the precomputed expression, with a trigger to keep it up to date, > and index that column. This also means the optimization is not > transparent: you have to explicitly use the precomputed column in your > query. > > It seems expression indexes have been MySQL's todo list since at least > 2007 :( > > You can of course still use RLIKE/REGEXP instead of adding this > redundant column, but you'll get a full table scan every time. A > classic space/time performance tradeoff :) > > -Kyle > > > > 2009/10/10 Andre Stechert <stech...@gmail.com > > > <mailto:stech...@gmail.com>> > > > > > > > > > This is not really a sqlalchemy question, but the quick answer > > > is that you need to convert both your indexed data and your queries > > > to the same normal form. In your example, you appear to be > > > correctly stripping spaces and periods in your query. If you > > > haven't done that in the database, then you should do it there, > > > too. If you need to preserve the original formatting of the > > > telephone number column, then create another column that contains > > > the stripped phone numbers. You probably also want to put an index > > > on that column. > > > > > > Lastly, a minor note on the sample code: you appear to be > > > missing a "%" operator in your LIKE query. > > > > > > Cheers, > > > Andre > > > > > > On Fri, Oct 9, 2009 at 5:46 AM, Christian Démolis > > > <christiandemo...@gmail.com <mailto:christiandemo...@gmail.com>> > > > wrote: > > > > Hi everybody, > > > > > > > > I m stuck with a query about telephone number : I want to find in > > > > my database all the contact who have a telephone number. The > > > > difficulty is that some number in the database can have space or . > > > > between numbers > > > > example : 06.06.50.44.11 or 45 87 12 45 65 > > > > > > > > This my query with like but it s not what i want because i ignore > > > > telephone number who have special chars > > > > > > > > NumeroApparu = "0645444444" > > > > s = session.query(Contact.IdContact, Contact.Civilite, > > > > Contact.Nom, Contact.Prenom, > > > > > > > > > ContactTel.Tel).filter(ContactTel.IdContact==Contact.IdContact).filter(Contact.IdDossier==self.dossierPourChargement.IdDossier).filter(ContactTel.Tel.like(NumeroApparu)) > > > > > > > > i saw class sqlalchemy.sql.expression.ColumnOperators¶ in the doc > > > > but lack of explication... > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---