Vrees bewaarheid

Altijd, altijd, altijd hetzelfde. En ik weet het op voorhand, ‘t zou ook wel mogen na al die jaren programmeren: begin aan iets met de gedacht van “rap eens iets in elkaar flansen en niet te vele naar proper coderen kijken”, en dat groeit binnen de kortste keren uit tot een soep van spaghetticode en vuiligheid.

Ik heb in mijn nieuw ding ondertussen al een overzicht van boeken per auteur, en met javascript/css om eventuele biografische info te tonen of niet, maar het programmeren zelf wordt vies.

Misschien eens uitkijken om een books.zog.org of zo aan te maken op een server die wel CFMX heeft draaien, en dan voor ‘t proper herbeginnen? Maar ondertussen wel nog wat verderbrielen (met dank aan Alain voor de term).

Met name aan het alfabetisch tonen van boektitels. Ik krijg er de kriebels van als alle boeken met “The…” of “De…” onder T en D staan, en daar komen dus kunstgrepen in SQL aan te pas:

select book_id, book_title,
case left(book_title,charindex(' ',book_title)) 
  when 'The ' then right(book_title, len(book_title)-4)+', The'
  when 'A ' then right(book_title, len(book_title)-2)+', A'
  when 'An ' then right(book_title, len(book_title)-3)+', An'
  when 'De ' then right(book_title, len(book_title)-3)+', De'
  when 'Le ' then right(book_title, len(book_title)-3)+', Le'
  when 'La ' then right(book_title, len(book_title)-3)+', La'
  when 'Un ' then right(book_title, len(book_title)-3)+', Un'
  when '''t ' then right(book_title, len(book_title)-3)+', ''t'
  when 'Les ' then right(book_title, len(book_title)-4)+', Les'
  else 
    case left(book_title,2) 
      when 'L''' then right(book_title, len(book_title)-2)+', L'''
      else book_title
    end
end
as book_sortTitle, ...

Zucht. Niet mooi van SQL, maar wel verrekte handig. Helaas werkt het niet in Access, dus dat wordt even zoeken. Iets met switch of zo? Mff. Een eerste approximatie geeft mij dit:

SELECT tblBooks.book_ID, tblBooks.book_title, 
switch(
   Left(book_title,instr(book_title, " "))="De ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Het ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Een ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="The ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="A ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="An ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="''t ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Le "
     ,right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="La ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Les ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="L''",
     right(book_title,len(book_title)-instr(book_title, " "))
) as book_sortTitle
FROM tblBooks

…maar dat ziet er toch écht wel heel vies uit. Takkoord, het werkt, maar het is…yechh! Al die keren dat die instr() geëvalueerd wordt, bah.

En denk niet dat het met een

switch(
   Left(book_title,4)="Het ", right(book_title,len(book_title)-4),
   Left(book_title,4)="Een ", right(book_title,len(book_title)-4),

opgelost is: nope. Alle individuele dingen in een switch worden geëvalueerd, regardless of de conditie als true evalueert of niet. Dus krijg ik syntax errors op right(book_title,len(book_title)-4) als Access bijvoorbeeld voorbij het boek met de titel ’48 komt (wegens maar drie karakters lang).

Enfin, dus dan maar overal waar het minder dan 3 is hardgecodeerd (living on the edge!):

SELECT tblBooks.book_ID, tblBooks.book_title, 
switch(
   Left(book_title,2)="A ", right(book_title,len(book_title)-2),
   Left(book_title,2)="L''", right(book_title,len(book_title)-2),
   Left(book_title,3)="''t ", right(book_title,len(book_title)-3),
   Left(book_title,3)="De ", right(book_title,len(book_title)-3),
   Left(book_title,3)="An ", right(book_title,len(book_title)-3),
   Left(book_title,3)="Le ", right(book_title,len(book_title)-3),
   Left(book_title,3)="La ", right(book_title,len(book_title)-3),
   Left(book_title,instr(book_title, " "))="Het ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Een ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="The ",
     right(book_title,len(book_title)-instr(book_title, " ")),
   Left(book_title,instr(book_title, " "))="Les ",
     right(book_title,len(book_title)-instr(book_title, " "))
) as book_sortTitle
FROM tblBooks