Toon posts:

[mySQL] LIKE clause

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maak een systeem waar delen van het alfabet kunnen worden opgegeven als achternaam. Ik heb het alfabet als het ware in 4 delen gesplitst in mijn ontwerp. Nu ga ik vanuit php een query sturen naar mijn mysql database alsvolgt:

"SELECT * FROM smoelen WHERE
Achternaam LIKE 'r%' OR
Achternaam LIKE 's%' OR
Achternaam LIKE 't%' OR
Achternaam LIKE 'u%' OR
Achternaam LIKE 'v%' OR
Achternaam LIKE 'w%' OR
Achternaam LIKE 'x%' OR
Achternaam LIKE 'y%' OR
Achternaam LIKE 'z%'
ORDER BY Achternaam";

Dit resulteert inderdaad in dat ik alle namen krijg die met 1 van de letters r-z beginnen. Heel mooi, maar met mssql kan ik iets van WHERE achternaam LIKE '[a-z]%'doen. Kan zoiets niet ook in mysql? Kan dit niet sneller?

  • CyberSnooP
  • Registratie: Augustus 2000
  • Laatst online: 31-03 16:47

CyberSnooP

^^^^ schrijft --->

Bedenk wel dat er dan voor elke entry van je smoelenboek een Regular Expression moet worden uitgevoerd. Opzich niet heel kwalijk, maar snel is het niet.

Je kunt misschien beter de ascii waarde van je eerste karakter als apart veld opnemen. Je creert hiermee data-redundantie, maar lijkt me niet lastig de gegevens actueel te houden (elke Achternaam update moet worden vergezeld van een EersteLetter update) en bovendien is het goed te verantwoorden.

|_____vakje______|


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

substring(Achternaam, 0,1) IN ('r', 's', 't', ...)
is vele malen sneller dan de regular expression versie :) (staat me iig bij :P )

Overigens is het idee een hele tijd geleden geopperd door Onno en is dit dus niet een briljante ingeving van mij :P

Ik geloof dat je zelfs
substring(Achternaam, 0, 1) BETWEEN 'r' AND 'z'
mag doen en dat is _nog_ sneller :) (enige nadeel is dat de r en z er niet bij zitten dus je moet de q pakken en de letter die na de z komt ( char(ord('z')+1) zal je het wel mee kunnen vinden :) )

Levert dus dan op:

substring(Achternaam, 0, 1) BETWEEN char(ord('r')-1) AND char(ord('z')+1)

en mocht dat niet werken, dan kan je nog de ord van die substring pakken etc etc etc :P

[ Voor 58% gewijzigd door ACM op 24-11-2002 23:33 ]


Verwijderd

Het is inderdaad zo dat de manier van ACM (between) werkt en stukken sneller is.
Regular Expressions zijn altijd trager..

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 18-08 11:34

Goodielover

Only The Best is Good Enough.

ACM schreef op 24 November 2002 @ 23:28:
[...]
(enige nadeel is dat de r en z er niet bij zitten dus je moet de q pakken en de letter die na de z komt ( char(ord('z')+1) zal je het wel mee kunnen vinden :) )

Levert dus dan op:

substring(Achternaam, 0, 1) BETWEEN char(ord('r')-1) AND char(ord('z')+1)
[...]
Bij een between is het inclusief de grenzen, dus het werkt gewoon zonder de grensverplaatsing

Verwijderd

Topicstarter
oke, thanx for the replies. Ik krijg het niet voor elkaar gebakken om een werkende query met zo'n substring voor elkaar te boxen. Ff op internet doorzoeken naar een goed mySQL boek/tutorial ding :D

in ieder geval bedankt!

[ Voor 4% gewijzigd door Verwijderd op 25-11-2002 23:08 ]

Pagina: 1