Avatar billede cronick Nybegynder
24. september 2007 - 22:38 Der 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?

- På forhånd tak!
Avatar billede w13 Novice
24. september 2007 - 22:41 #1
Du stykker bare sql sammen. Det er jo bare en normal string.

strSQL = "SELECT * FROM [tabel] "
if BETINGELSE then
  strSQL = strSQL&"ORDER BY [dato]"
else
  strSQL = strSQL&"ORDER BY [text]"
Avatar billede cronick Nybegynder
24. september 2007 - 23:21 #2
Læs venligst min besked igen.. :)

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..
Avatar billede cronick Nybegynder
24. september 2007 - 23:24 #3
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..
Avatar billede cronick Nybegynder
24. september 2007 - 23:40 #4
Det er nok lidt kringlet.

Jeg har f.eks. følgende data i denne celle, i min tabel:

yes
no
22-09-07
yes
23-09-07
24-09-07

Målet er så at kunne få følgende to lister op ved hjælp af Order By .. og DESC/eller ikke
Avatar billede cronick Nybegynder
24. september 2007 - 23:41 #5
24-09-07
23-09-07
22-09-07
yes
yes
no

samt modsat..

22-09-07
23-09-07
24-09-07
no
yes
yes

- og undskyld for de mange kommentarer det er fordelt over nu.. :)
Avatar billede w13 Novice
25. september 2007 - 02:12 #6
if isDate(celle1) then?
Avatar billede ldanielsen Nybegynder
25. september 2007 - 08:14 #7
I nogen databaser kan man bruge udtrykket CASE, som modsvarer if.

Hvilken database er det?

SELECT CASE (column_name)
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  ...
  ELSE resultN
  END
FROM table_name
Avatar billede ldanielsen Nybegynder
25. september 2007 - 08:15 #8
I øvrigt synes jeg ikke man skal have datoer i tekstfelter
Avatar billede cronick Nybegynder
25. september 2007 - 11:45 #9
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.. :)
Avatar billede nielle Nybegynder
25. september 2007 - 11:47 #10
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.
Avatar billede neoman Novice
25. september 2007 - 15:32 #11
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)
Avatar billede neoman Novice
25. september 2007 - 15:45 #12
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.
Avatar billede nielle Nybegynder
25. september 2007 - 20:27 #13
Jeg ville nu vælge det som plan A :^)
Avatar billede cronick Nybegynder
25. september 2007 - 23:38 #14
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å.

Tror godt jeg kunne impletere "plan b" i min kode, men det ville blive alt for indviklet, da jeg har omkring 10-15 celler af denne type.

Men er det ikke muligt at lave en funktion, nogenlunde ligesom CASE, bare der virker til mit tilfælde?
Avatar billede nielle Nybegynder
26. september 2007 - 06:52 #15
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)
Avatar billede neoman Novice
26. september 2007 - 08:56 #16
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.
Avatar billede cronick Nybegynder
26. september 2007 - 21:35 #17
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..
Avatar billede neoman Novice
26. september 2007 - 21:46 #18
Det har du.

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.
Avatar billede neoman Novice
26. september 2007 - 21:54 #19
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.
Avatar billede neoman Novice
26. september 2007 - 21:59 #20
Hvis du har inputvalidering, så ved du hvad der er tilladt, og så ved du også hvad der er en dato og hvad der et ord, så ingen ko på isen:)
Avatar billede neoman Novice
26. september 2007 - 22:02 #21
Det sidste kan du opnå ved at køre regexp på cellen - så kan du finde ud af hvad du har.
Avatar billede neoman Novice
26. september 2007 - 22:05 #22
Jeg må være træt - dårligt eksempel!!! 2007-10-12 før 2007-12-10 som strin, mens i dit format kommer 10-12-2007 før 12-10-2007 :)
Avatar billede ldanielsen Nybegynder
27. september 2007 - 09:56 #23
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.. :)

Kan du ikke gøre sådan (cirka)

strSQL = "SELECT celle1, CASE (celle1)
  WHEN <er dato> THEN dateformat(celle1, dd-mm-yy)
  ELSE celle1
  END AS OrderFelt
FROM tabel
ORDER BY OrderFelt
Avatar billede cronick Nybegynder
27. september 2007 - 14:33 #24
Nåå, misforstod dit svar neoman. Lagde ikke mærke til, at du bare ville have at datoen skulle være af typen yyyy-mm-dd - og dette virker ja, tak.. :)

Dine metode ser umiddelbart også lovende ud - skal dog ikke bruge den, da jeg har fået løst det nu. Ellers tak.. :)

Neoman og Idanielsen, I er begge velkommen til at smide et svar.. ;)
Avatar billede neoman Novice
27. september 2007 - 19:43 #25
tada :)
Avatar billede ldanielsen Nybegynder
28. september 2007 - 11:07 #26
Ok
Avatar billede cronick Nybegynder
28. september 2007 - 14:45 #27
Sådan - og tak for hjælpen.. ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester