Vandaag had ik op het werk een probleem. Het is een nogal technisch verhaal. Dus als je dat niet wil lezen, hou dan nu op
Waar ging het om? In een tabel met personen moest ik mensen groeperen. En groeperen op de eerste letter van de achternaam. Dat lijkt makkelijk… Dat werkte ook al… Het probleem is als volgt; de eerste letter van een naam is niet altijd een Nederlandse. Het kan ook een Slavische naam zijn, of weet ik het. Bijvoorbeeld een naam die begint met een Ô (let op het dakje bovenop). Die verwachten onze klanten (logischerwijs) bij de O. Nou, SQL Server denkt daar anders over. En terecht, een O is namelijk geen Ô. Dan kom je dus in het gebied van de speciale tekens.
Deze speciale tekens zijn er vaak in buitenlandse namen. Daar moest dus een oplossing voor komen. En die heb ik gevonden! Hoe? Door met de collation van het veld te gaan spelen. Door die op een van de types te zetten zodat de tekens genegeerd worden.
Let wel; ik verander mijn tabel niet. Dat is voor een zoekopdracht niet nodig dacht ik zo.
SELECT * FROM personen WHERE LEFT(naam, 1) LIKE 'O'
Bovenstaande code vind dus geen Ó of Ô of welke speciale O dan ook. Hij vind alleen O.
SELECT * FROM personen WHERE LEFT(naam, 1) COLLATE SQL_Latin1_General_Cp850_CI_AI_KI_WI LIKE 'O' COLLATE SQL_Latin1_General_Cp850_CI_AI_KI_WI
Bovenstaande vind die speciale O’s echter wel! Het gedeelte COLLATE SQL_Latin1_General_Cp850_CI_AI_KI_WI zorgt namelijk voor drie dingen;
- Dictionary order, dus er word gesorteerd volgens het woordenboek.
- Case-insensitive, dus hoofd of kleine letters maken ook niet meer uit.
- Accent-insensitive, DAT zorgt er voor dat accenten, trema’s en dergelijke genegeerd worden!
Dat is dus gewoon de truc; even bij SQL Server aangeven dat het genegeerd moet worden, en het loopt als een zonnetje!
Bovenstaande heb ik enkel getest bij SQL Server 2000, maar ik denk dat het de truc op meer DBM’s doet. Speel er eens mee, het is heel handig!
Geen gerelateerde berichten.



Loading...