Avatar billede donkazz Nybegynder
28. november 2006 - 14:19 Der er 8 kommentarer og
2 løsninger

Advanceret SQL sætning med case?

Hejsa!

Jeg har læst i en bog at man kan bruge case sætninger i sin MS SQL, men jeg har ikke helt lært det endnu og jeg har selvfølgelig ikke lige bogen ved min side nu hvor jeg skal bruge det. :-)

Kort sagt er jeg ved at lave en simpel nyhedsfunktion hvor hver nyhed har en oprettet dato og så et ja/nej felt, hvis nyheden skal være en "sticky" - altså altid ligge øverst.

Det jeg så gerne vil have min SQL til er, at hente alle nyheder ud fra databasen som enten er nyere end 30 dage gamle ELLER er en sticky, sådan så sticky'er altid bliver hevet ud uanset oprettet dato, men hvor ikke-sticky nyheder kun bliver vist hvis de er nyere end 30 dage gamle.

tabellen hedder "news", felterne hedder "createdDate" og "sticky".

Anyone?
:-D

Mvh.
Kasper
Avatar billede beef12 Nybegynder
28. november 2006 - 14:24 #1
select *
from news
where sticky = 1
union all
select *
from news
where
createdDate > getdate()-30
Avatar billede beef12 Nybegynder
28. november 2006 - 14:25 #2
Tja, du gider sikkert ikke se sticky meddelelser 2 gange, dermed er der tilføjet en ekstra linie :-)

select *
from news
where sticky = 1
union all
select *
from news
where
createdDate > getdate()-30
and sticky = 0
Avatar billede donkazz Nybegynder
28. november 2006 - 14:35 #3
Oh cool.. men faktisk, så ser min nuværende SQL sådan her ud (havde lige glemt jeg også inner joinede lidt.. ups)

"SELECT n.ID, n.headline, n.context, n.relLink, n.addedDate, a.name, n.sticky " &_
"FROM news n INNER JOIN " &_
"admins a ON " &_
"n.addedBy = a.ID " &_
"INNER JOIN " &_
"departments d ON " &_
"a.departmentID = d.id " &_
"WHERE d.id = " & deprs("ID") & " " &_   
"ORDER BY n.sticky DESC, n.addedDate"

Hooow to put din sætning ind i der? :)
Avatar billede lorentsnv Nybegynder
28. november 2006 - 14:45 #4
"SELECT n.ID, n.headline, n.context, n.relLink, n.addedDate, a.name, n.sticky " &_
"FROM news n INNER JOIN " &_
"admins a ON " &_
"n.addedBy = a.ID " &_
"INNER JOIN " &_
"departments d ON " &_
"a.departmentID = d.id " &_
"WHERE d.id = " & deprs("ID") & " " &_   
"AND (n.sticky = 1 OR n.addedDate >= (getdate() - 30)) " &_   
"ORDER BY n.sticky DESC, n.addedDate"
Avatar billede lorentsnv Nybegynder
28. november 2006 - 14:50 #5
beef12> Hvis du bruger UNION i denne sammenhæng, skal du nok ikke have ALL med, da du vil få dubletter. Alle Sticky som er mindre end 30 dage gamle, vil komme med to gange. Hvis du kún bruger UNION og ikke UNION ALL, vil du ikke få dubletter med.
Avatar billede donkazz Nybegynder
28. november 2006 - 15:03 #6
nå ja selvfølgelig, det kunne jo løses med en OR... dammit... :-D Det var dyre 200 point.. haha...

Nå men smid svar begge to, så ryger der point over fra mig..
Avatar billede pierrehusted Nybegynder
28. november 2006 - 15:08 #7
Der er ingen grund til at bruge CASE her. CASE er hvis du vil have flere forskellige udtryk udfra et bestemt logisk udtryk. CASE bruges i SELECT-delen af SQL-sætningen, ikke i WHERE.

Et eksempel fra BOOKS ONLINE:

SELECT    'Price Category' =
      CASE
        WHEN price IS NULL THEN 'Not yet priced'
        WHEN price < 10 THEN 'Very Reasonable Title'
        WHEN price >= 10 and price < 20 THEN 'Coffee Table Title'
        ELSE 'Expensive book!'
      END,
  CAST(title AS varchar(20)) AS 'Shortened Title'
FROM titles
ORDER BY price


-------------------------------------------------------

Det du vil have her er alle poster hvor enten sticky er sat eller dato er mindre end 30 dage gammel:

WHERE
sticky = 1 OR createdDate > (getdate()-30)

(Sat ind i din sætning sådan som Lorentsnv har skrevet kl 14:45)
Avatar billede lorentsnv Nybegynder
28. november 2006 - 15:27 #8
svar :)
Avatar billede beef12 Nybegynder
29. november 2006 - 08:19 #9
ok - her er et svar. Men giv hellere lorentsv de fleste. Hans løsning er meget bedre.
Avatar billede donkazz Nybegynder
29. november 2006 - 09:38 #10
Sådan.. Tak for hjælpen begge to. :)
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
Computerworld tilbyder specialiserede kurser i database-management

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