Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Hulp gewenst bij query

Pagina: 1
Acties:

  • Isnowiz
  • Registratie: Mei 2005
  • Laatst online: 16-09 11:42
In een database-veld staat een string, die meerdere woorden kan bevatten...
Een gebruiker geeft een invoer, die gematched moet worden...

Stel dat we het volgende veld hebben 'blah invoer mehh' en invoer = 'invoer', dan kan ik die bewuste row matchen met de volgende query:
SQL:
1
SELECT * FROM tabel WHERE name REGEXP '[[:<:]]invoer[[:>:]]'


Dat werkt verder prima, ook als 'invoer' vooraan of achteraan in de string staat...
Echter, wil ik nog een stap verder: Er kunnen in het database-veld ook wildcards staan...
Een regel met 'blah inv*oer mehh' moet matchen met 'invoer', 'inv', 'invo', 'invoe' en uiteraard met 'blah' en 'mehh'...

Ik buig me nu al enkele dagen over dit probleem en ik kom er niet meer uit...
Een vriend van me had al geopperd om 'invoer' op te splitsen in 'invoer', 'i*', 'in*', 'inv*', enz. en deze mogelijkheden allemaal apart te proberen met afzonderlijke queries. Dit lijkt me momenteel de beste optie, maar het zou toch het mooiste zijn als het met 1 query kan.
Wellicht dat er iemand is die visie wil los laten op dit probleem... Zelf ben ik helaas niet zo'n ster in regexp.

Bij voorbaat alvast heel erg bedankt voor de feedback!

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 11:20

voodooless

Sound is no voodoo!

Lijkt me een kwestie van wildcards omzetten naar gelde regexp wildcards.

Do diamonds shine on the dark side of the moon :?


  • Isnowiz
  • Registratie: Mei 2005
  • Laatst online: 16-09 11:42
voodooless schreef op donderdag 22 november 2007 @ 21:30:
Lijkt me een kwestie van wildcards omzetten naar gelde regexp wildcards.
Hmm, dat is inderdaad ook interessant... De strings in de database gewoon opslaan met MySQL wildcards ipv *... Dan zou ik het bij de invoer al moeten veranderen...
Maarrrrr... Blijft het probleem dat er wildcards aan de linkerkant van REGEXP staan... Gaat dat wel werken dan?

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 28-11 23:34

NetForce1

(inspiratie == 0) -> true

Als je nou zorgt dat de strings in de database geldige regexps zijn kun je de argumenten van regexp in je query omdraaien. zoiets dus:
SQL:
1
SELECT * FROM tabel WHERE '[[:<:]]invoer[[:>:]]' REGEXP name
Dat is volgens mij ook wat voodooless bedoelt

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Isnowiz
  • Registratie: Mei 2005
  • Laatst online: 16-09 11:42
NetForce1 schreef op donderdag 22 november 2007 @ 21:44:
Als je nou zorgt dat de strings in de database geldige regexps zijn kun je de argumenten van regexp in je query omdraaien. zoiets dus:
SQL:
1
SELECT * FROM tabel WHERE '[[:<:]]invoer[[:>:]]' REGEXP name
Dat is volgens mij ook wat voodooless bedoelt
Kijk, dat is nog een mooie tip :)
Ik ga er mee aan de gang, bedankt!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

NetForce1 schreef op donderdag 22 november 2007 @ 21:44:
Als je nou zorgt dat de strings in de database geldige regexps zijn kun je de argumenten van regexp in je query omdraaien. zoiets dus:
SQL:
1
SELECT * FROM tabel WHERE '[[:<:]]invoer[[:>:]]' REGEXP name
Dat is volgens mij ook wat voodooless bedoelt
Dat zal niet werken, omdat speciale karakters aan de ene kant van de regex operator gewoon als string karakters worden geinterpreteerd, terwijl ze aan de andere kant als regex karakters worden geinterpreteerd. Je zal ze aan de rechterkant moeten escapen (hoe dat in het MySQL regex dialect ook precies moet), waardoor het geen geldige regex wildcards meer zijn.

Bovendien gebeuren er waarschijnlijk geen handige dingen als je in een database geldige regexen op gaat slaan, die je vervolgens met een regex wilt gaan matchen.... die je vervolgens in de database gaat opslaan om weer met een regex te matchen, etc. ad infinitus?

[ Voor 9% gewijzigd door Confusion op 22-11-2007 22:05 ]

Wie trösten wir uns, die Mörder aller Mörder?


  • Isnowiz
  • Registratie: Mei 2005
  • Laatst online: 16-09 11:42
Confusion schreef op donderdag 22 november 2007 @ 22:01:
[...]

Dat zal niet werken, omdat speciale karakters aan de ene kant van de regex operator gewoon als string karakters worden geinterpreteerd, terwijl ze aan de andere kant als regex karakters worden geinterpreteerd. Je zal ze aan de rechterkant moeten escapen (hoe dat in het MySQL regex dialect ook precies moet), waardoor het geen geldige regex wildcards meer zijn.

Bovendien gebeuren er waarschijnlijk geen handige dingen als je in een database geldige regexen op gaat slaan, die je vervolgens met een regex wilt gaan matchen.... die je vervolgens in de database gaat opslaan om weer met een regex te matchen, etc. ad infinitus?
Die boundaries aan de linkerkant van REGEXP moeten sowieso weg.. Dat was inderdaad gewoon als tekst gezien, maar zelfs al zou het werken: Er kan ook '$%@#$&@#' in de database staan, en daar staat geen enkele boundary in...

Ik kijk nu naar de mogelijkheid om de string 2x op te slaan... 1x gewoon en 1x als regexp
Mocht iemand nog een betere suggestie hebben dan hoor ik het graag

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Even in normale (PCRE) regex:
de regex "foo.*bar" matched de string "foobazbar", maar
de regex "foobazbar" matched niet de string "foo.*bar".

Regexen werken maar 1 kant op. Dat kan ook niet anders: ze reduceren tenslotte vele verschillende zinnen tot dezelfde expressie. Die informatie krijg je nooit meer terug.

Wie trösten wir uns, die Mörder aller Mörder?

Pagina: 1