24. september 2007 - 22:38Der er
25 kommentarer og 2 løsninger
if inde i sql statement
Hej,
Jeg er stødt på et lille problem. Jeg har lavet et sorteringssystem. Problemet er, at jeg i en af mine celler både har dato'er af typen dd-mm-yy samt helt alm. tekst. Er der nogen mulighed for, at jeg inde i min sql-statement kan lave en form for "if", som checker om indeholdet er af denne dato-type eller alm. tekst, og hvis dato-typen derved sorteres som dato?
Den metode vil ikke kunne checke noget mht. cellen i tabellen, da BETINGELSE er noget forudbestemt. BETINGELSE skal være selve indeholdet af en af mine celler, i den eksakt samme tabel jeg skal hente det i..
strSQL = "SELECT celle1 FROM [tabel]" if celle1 = dd-mm-yy then strSQL = strSQL & "Order by dateformat(celle1, dd-mm-yy)" else strSQL = strSQL & "Order by celle1" end if
Hvis det gør det lidt nemmere at forstå det på den måde..
Det synes jeg heller ikke - men personen som det skal laves til, skal både kunne skrive dato'er samt alm tekst, idet han f.eks. skal kunne skrive ASAP, YES, NO osv.. Og samtidig skal det kunne sorteres.
Det er i øvrigt Microsoft Acces Database..
Og mht. til CASE og WHEN ser det nogenlunde rigtigt ud - det skal bare gøres ved sortering og ikke der hvor man "selecter" cellerne.. :)
Det kunne man jor ordne ved at tilføje et ekstra felt til den slags oplysninger - den kunne så passende være defineret som en enum med de lovlige værdier for dette felt.
Hvis du har blandede værdier i feltet, så betyder det jo at feltet er string og ikke datetime i DB'en. I det tilfælde bør du skrive dine datoer på formatet yyyy-MM-dd, og så kan du sagtens sortere hele molevitten med almindelig ORDER BY, uden at bekymre dig om det aktuelle indhold.
For at vise datoerne så kan de jo omformateres inden display (og inden insert)
Og Plan B ville være at have to kolonner i stedet for en. En DateTime til datoer og en Comments til dine bemærkninger. Så er der igen ingen problemer med sortering, der skal bare lidt logik til på ASP siden til at lægge de rigtige ting i de rigtige kolonner.
Endnu en gang må jeg gentage mig selv; der skal både være dato samt tekst i cellen, og det skal kunne sorteres som jeg har vist et eksempel på.>
neoman har allerede svaet på den i 25/09-2007 15:32:45 ovenfor.
Jeg tillader mig bare fortsat at mene at man skal bruge databasens typer til det som de er lavet til - datoer skal i date-felter, tekst skal i tekst-felter, og hvis man har et sær af værdier (ASAP, YES, NO, osv.) hvor der kun er et bestemt fast antal så skal de i et enum felt. Erfaringsvist har det vist sig at give mere klar ode samt ode som performer bedre.
(Selvfølgelgt er der altid tillfælde hvor man ikke bør gøre detpå den måde)
Jeg tror du har fået blandet sammen "celle" og "felt" . Din "celle" er, så vidt jeg forstår, det som vises for brugeren, mens "felt" er det som er i Db'en - og de to behøver ikke være 100 % ens. Hvis du nu skriver de datoer i DB'en som strings, men formateret som jeg har vist 15:32:45, så kan du sortere på dem med en almindeling string sort, og stadig få den rigtige rækkefølge ud, og alt det uden diverse CASE/funktioner osv.
Da jeg har godt 15 felter (eller celler, som jeg vælger at kalde det nogengange) af denne type, så ville det blive en alt for kompliceret tabel i sidste ende, hvis jeg skulle lave ét felt mere til hver af disse.
Ang. dit inlæg d. 15:32:45, neoman, er du så sikker på det ville virke? Den vil jo på et tidspunkt f.eks. bruge ordet ASAP som dateformat, hvis jeg skulle bruge din metode, og så med rimelig sandsynlighed komme med en fejl? Medmindre jeg selvfølgelig har misforstået dit svar..
Det jeg siger er at du har STRINGS i feltet. For at få datoer sorteret ikke efter værdien af dato, men som STRINGS, så skal formatet være som vist. Dvs en dato som hedder,SOM STRING, "2007-10-12" kommer før "2007-12-13" mens hvis du blot lader dem stå i dit format, SOM STRING, så får du "13-12-2007" før "12-10-2007". Da ASAP, OK, NO, YES er almindelige strings, så vil alle dine datoer komme først og derpå dine ord, ved en ORDER BY ASC da der sorteres rent og skært på ANSI/ASCII-værdien af hvert tegn, uanset om det er ciffer eller bogstav.
Nu har jeg ikke styr på ASP - men er der ikke en funktion hvor du kan checke om en string kan konverteres til DateTime ? CDate eller noget lignende ? Så kan du bare konvertere de værdier so lader sig konvertere, formatere dem som beskrevet, mens de alm "ord" bare bliver direkte gemt i feltet i db-rækken.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.