Pagina 1 van 1
[opgelost]syntax hoofdlettergevoeligheid
Geplaatst: vr sep 04, 2009 11:17 am
door peetieq2
Kan iemand mij zeggen wat de precieze syntax moet zijn van het volgende probleem:
Ik wil een query maken in BASE (met een HSQL-engine dus) die het volgende doet:
Geef mij alle woorden die de volgende letters bevatten:
en dan een rijtje letters (parameters).
Echter: bij de zoektocht moet hij geen onderscheid maken tussen hoofdletters en kleine letters, hij moet dus zowel hoofd- als kleine letters vinden:
Ik dacht dat het iets was van:
LIKE '%' || :let1 || '%' etc, maar dat werkt niet, wie heeft voor mij de goede syntax?
met dank PT
Re: syntax hoofdlettergevoeligheid
Geplaatst: vr sep 04, 2009 4:06 pm
door henke54
Re: syntax hoofdlettergevoeligheid
Geplaatst: vr sep 04, 2009 11:27 pm
door eremmel
Probeer eens
Code: Selecteer alles
.... WHERE UPPER(<field>) LIKE UPPER( '%' || :let1 || '%')
Dit lost je hoofd/kleine letter probleem op. Maar als ik je goed begrijp dan wil je ook nog zoeken op meerdere letters tegelijk en dan elke keer een andere hoeveelheid letters. Je kunt met verschillende parameters werken en dan iets doen als
Code: Selecteer alles
... WHERE UPPER(<field>) LIKE UPPER( '%' || :let1 || '%')
OR UPPER(<field>) LIKE UPPER( '%' || :let2 || '%')
maar dan krijg je alles als je bv voor :let2 niets invult omdat dan de LIKE vergelijking '%%' wordt. Dit zou je weer kunnen ondervangen met de truuk om parameter :let2 te combineren met :let1 en daarvan weer de eerste letter te nemen:
Code: Selecteer alles
... WHERE UPPER(<field>) LIKE UPPER( '%' || :let1 || '%')
OR UPPER(<field>) LIKE UPPER( '%' || SUBSTRING(CONCAT(:let2, :let1),1,1) || '%')
De laatste stap is om het gemak te dienen en maar 1 parameter te gebruiken voor het zoeken op een aantal letters. Het maximale aantal letters bepaal je door je query:
Code: Selecteer alles
... WHERE UPPER(<field>) LIKE UPPER( '%' || COALESCE(SUBSTRING(:Letters,1,1),'') || '%')
OR UPPER(<field>) LIKE UPPER( '%' || SUBSTRING(:Letters,2,1) || '%')
OR UPPER(<field>) LIKE UPPER( '%' || SUBSTRING(:Letters,3,1) || '%')
OR ...
Voor de eerste LIKE gebruik ik COALESCE om er voor te zorgen dat als je niets op geeft je alles krijgt. SUBSTRING() geeft een NULL waarde als je buiten de grenzen van een string zoekt, dus dan is het resultaat van '%' || NULL || '%' ook NULL en het resultaat van UPPPER() ook en levert de LIKE niets op. Precies wat we nodig hebben voor de 2-de, 3-de, ... letter.
Re: syntax hoofdlettergevoeligheid
Geplaatst: za sep 05, 2009 11:54 pm
door peetieq2
Ik heb een heel eenvoudige oplossing gevonden voor mijn probleem:
Je kunt in plaats van tekentype VARCHAR ook voor VARCHAR_IGNORECASE kiezen. Dit heeft als grote voordeel dat je er bij je query geen rekening meer mee hoeft te houden.
De volledige syntax werd:
SELECT "Lengte", "Veld1" FROM "lijst" AS "lijst" WHERE ( "Lengte" > 6 AND "Veld1" LIKE '%' || :let1 || '%' AND "Veld1" LIKE '%' || :let2 || '%' AND "Veld1" LIKE '%' || :let3 || '%' AND "Veld1" LIKE '%' || :let4 || '%' AND "Veld1" LIKE '%' || :let5 || '%' AND "Veld1" LIKE '%' || :let6 || '%' AND "Veld1" LIKE '%' || :let7 || '%' OR "Veld1" = NULL ) ORDER BY "Lengte" ASC, "Veld1" ASC
Bedankt voor het meedenken
PT
Re: [opgelost]syntax hoofdlettergevoeligheid
Geplaatst: zo sep 06, 2009 5:34 pm
door eremmel
VARCHAR_IGNORECASE is ook een oplossing (Ik zie dat ik je vraag mbt dee zoektermen verkeerd heb gelezen).
Een opmerking over je oplossing:
- Op deze manier kun je alleen woorden met 7 zoek-letters vinden. Als je op zoek bent naar een woord met 'ee', 'aa' en je geeft als letters een 'a' en nog een 'a' op dan vind toch ook woorden met 'a'. Dat kun je m.i. alleen oplossen door de woorden te coderen en als letter 'aa', 'ee' toe te staan.
- Wat is de betekenis van Veld1 = NULL? Dit moet zijn Veld1 IS NULL, maar kan dat dan?
Een generalisatie op je vraag met een minimale woord lengte argument en als functie van het aantal zoekletters, en het aantal zoekletters in één string tot een maximum van 7 zou kunnen zijn:
Code: Selecteer alles
WHERE LENGTH("Veld1") >= LENGTH(:letters) AND LENGTH("Veld1") >=(:min_woord_lengte)
AND "Veld1" like '%' || SUBSTRING(:letters,1,1)|| '%'
AND ( LENGTH(:letters) < 2 OR "Veld1" like '%' || SUBSTRING(:letters,2,1)|| '%' )
AND ( LENGTH(:letters) < 3 OR "Veld1" like '%' || SUBSTRING(:letters,3,1)|| '%' )
AND ( LENGTH(:letters) < 4 OR "Veld1" like '%' || SUBSTRING(:letters,4,1)|| '%' )
.....
AND ( LENGTH(:letters) < 7 OR "Veld1" like '%' || SUBSTRING(:letters,7,1)|| '%' )
De vgl (LENGHT(:letters) < 7 OR ... ) zorgt er voor dat je ook met minder dan 7 letters kunt zoeken.
Succes.