Volledige versie bekijken : SQL pattern matching



ultddave
20 September 2010, 23:48
Hey,

Ik zit met een probleem ivm pattern matching in SQL.

Ik heb een kolom in men database met allemaal id's, komma seperated. Bijvoorbeeld:
1,5,48,55,945,12135,654656

Nu wil ik een query uitvoeren om te kijken of het id "5" erin zit.
LIKE '%5%' zorgt ervoor dat ook getallen zoals 12135 als "juist" beschouwd worden omdat daar ook een "5" in zit.

LIKE '%,5,%' zorgt ervoor dat alleen het getal 5 gezien wordt. Wat de bedoeling is. Maar dit werkt uiteraard niet als het getal 5 vooraan of achteraan de rij staat.

Bijvoorbeeld, de rij:
5,15,27

Zal geen resultaat opleveren met LIKE '%,5,%' omdat er geen komma voor 5 staat.

Maar hiervoor vond ik geen oplossing met de beschikbare wildcards van SQL.

Ik kan uiteraard altijd vooraan en achteraan een komma toevoegen, zodat de lijst er zo uit ziet:
,5,15,27,

Dan werkt het perfect. Maar dat ziet er niet echt uit vind ik persoonlijk. Misschien weet iemand een betere oplossing?

PS: Er staan maximaal een 26 tal id's in die lijst. En er moeten ongeveer een 100.000 rijen gechecked worden met die SQL query.

Mvg,
Dave

carl
21 September 2010, 09:33
like %,5,% OR like 5,% ? :D (dit moet toch mogelijk zijn ?)

ultddave
21 September 2010, 13:08
Ik was blijkbaar aan het slapen gisteren :D. Inderdaad, zo gaat het voor alle mogelijkheden;
LIKE '%,5,%' OR LIKE '%,5' OR LIKE '5,%'

Bedankt. (y)

Mvg,
Dave

kurt0015
21 September 2010, 15:06
Tijdje terug had ik dit eens opgelost door overal een ; rond de getallen te zetten als snelle oplossing. Ook nooit echt bij nagedacht maar dit werkt inderdaad wel veel beter. :)

ultddave
22 September 2010, 13:34
Inderdaad :D.

Ik had gisteren nog een probleem (een spatie in een charlist ging niet: LIKE '%[ ]the[ ]%' is niet hetzelfde als '% the %'). Maar heb het opgelost via de REGEXP van MySQL:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html

Zeer handig vind ik persoonlijk. ;)

Je kan daar ook characterclasses gebruiken zoals [:alnum:] = klasse voor alfanumerieke karaketers en [:space:] wat een klasse is voor spaties, tabs, newlines en carriage return.

Zeer handig dus. En ook redelijk leesbaar :D.

Greetz,
Dave