Ælle bælle, mig ikke tælle

Hvordan får man et talt noget op, hvis computeren ikke kan tælle?

Okay, spørgsmålet er lidt skævt formuleret, men jeg sad her til aften med et problem på arbejdet, hvor jeg skulle have talt antallet af kommaer i en streng. I sproget (SQL under PostgreSQL) var der ikke nogen funktion, der kunne gøre det, så normalt ville mange nok kaste sig ud i at lave sin egen procedure/funktion/metode, der kan lave optællingen, fx ved brug af en løkke over strengens indhold eller over (iterativt) første forekomst af et komma. Det er dog rimelig omkostningsfuldt, både fordi man skal skrive den (så den virker 100%), og den er formodentlig ektremt meget langsommere at afvikle end en indbygget funktion, som kan forventes at blive afviklet direkte i optimeret maskinkode på CPU’en i modsætning til en stump SQL, som formodentlig er fortolket.

Så var det, at det slog mig, at jeg faktisk kunne løse problemet kun ved hjælp af to indbyggede funktioner:

  • length(), tæller antallet af tegn i en streng
  • replace(), laver søg/erstat i en streng

Antallet af kommaer i en streng er nemlig

length(replace(streng, ‘,’, ‘,,’) – length(streng)

dvs. først erstatter jeg alle kommaer med to kommaer, og så måler jeg, hvor meget længere strengen er blevet. Det synes jeg var rent smart set, og resultatet kørte da også sygeligt stærkt.

This entry was posted in Spild af tid. Bookmark the permalink.

2 Responses to Ælle bælle, mig ikke tælle

  1. US says:

    Alternativt må jeg sige*g*

    Har du faktisk prøvet at implementere en “almindelig” tællefunktion og sammenligne hastigheden med den?

    Jeg kender ikke til PostgreSQL, men uanset hvad synes jeg, det lyder lidt dyrt, at lave lave en “masse” streng-manipulation, bare for at finde længden. Men hvis en funktion, man selv laver, bliver fortolket, kan det jo sagtens være hurtigere…

  2. Walde says:

    Lige min stil!

    Jeg er helt pjattet med den slags genveje, som en dag får en stakkels læser til at tænke “…huh?”.`

    I samme kategori ynder jeg selv at (mis)bruge “indikator”-variable (0/1) til at med- eller undtage diverse led fra summer og produkter. I produkter bruges indikatoren som potens, i summer ganges den på leddet á la:

    c=a*ia + b*ib
    c=a^ia * b^ib

    Så sparer man IF’erne væk, og programmet er totalt ulæseligt.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>