Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Svår select

Postades av 2007-12-01 23:26:42 - Magnus Hallberg, i forum sql-server/msde, Tråden har 25 Kommentarer och lästs av 1056 personer

jag ska göra en sökfunktion som för mej blir ganska mycket sql att skriva. Det är 5 stycken dropdown och en textbox som användarna ska kunna välja i, till detta kommer också att användaren inte behöver välja nåt, då ska allt sökas igenom. Finns det nåt speciellt sätt eller nåt bra tips man kan få om hur man lägger upp det? Det blir ju många if-satser.


Svara

Sv: Svår select

Postades av 2007-12-03 13:42:05 - Magnus Hallberg

Så här har jag löst det nu, men detta är ju ingen bra lösning. Kan jag göra på nåt annat sätt? Kanske ha fler SP och fler gridar och binda dom till olika sqldatasourcer? Då kan jag ju styra emd kod vilken grid som ska synas när, men det känns inte heller som nån bra lösning. Min SP ser ut så här nu:
<code>
ALTER proc [IsellItAdmin].[getAllNotChooseAdvertiseHeaders]
@lanID int,
@catID int,
@subCatID int,
@searchWord varchar(50) = null
as
set nocount on
declare @errMess varchar(100)

if(@searchWord is not null and @lanID = 0 and @catID = 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.header like '%'+@searchWord+'%' or ad.[text] like '%'+@searchWord+'%' and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end

if(@lanID != 0 and @catID != 0 and @subCatID != 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.lanID = @lanID and ad.categoryID = @catID and subCategoryID = @subCatID and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end


if(@lanID != 0 and @catID != 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.lanID = @lanID and ad.categoryID = @catID and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end

if(@lanID != 0 and @catID = 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.lanID = @lanID and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end

if(@lanID = 0 and @catID != 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.lanID = @lanID and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end

if(@lanID = 0)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end

if(@searchWord is null)begin
select ad.approveDate, ad.header, ad.price, lan.lan, cat.category from advertises as ad
inner join lans as lan
on ad.lanID = lan.lanID
inner join categories as cat
on ad.CategoryID = cat.categoryID
where(ad.lanID = @lanID and ad.categoryID = @catID and subCategoryID = @subCatID and ad.isApproved = 'True' and ad.isPayed = 'True')
order by ad.approveDate desc
return
end
</code>
Jag har verkligen fastnat på denna.


Svara

Sv:Svår select

Postades av 2007-12-04 18:14:09 - Thomas Vanhaniemi

Tror något i stil med denna fråga kan lösa problemet åt dig
<code>
SELECT ad.approveDate, ad.header, ad.price, lan.lan, cat.category FROM advertises AS ad
INNER JOIN lans AS lan ON ad.lanID = lan.lanID
INNER JOIN categories AS cat ON ad.CategoryID = cat.categoryID
WHERE
ad.isApproved = True AND ad.isPayed = True AND
CASE WHEN @searchWord IS NULL THEN 1 ELSE ad.header LIKE '%' + @searchWord + '%' OR ad.text LIKE '%' + @searchWord + '%' END AND
CASE WHEN @lanID = 0 THEN 1 ELSE ad.lanID = @lanID END AND
CASE WHEN @catID = 0 THEN 1 ELSE ad.categoryID = @catID END AND
CASE WHEN @subCatID = 0 THEN 1 ELSE subCategoryID = @subCatID END
ORDER BY ad.approveDate DESC
</code>


Svara

Sv: Svår select

Postades av 2007-12-05 23:04:55 - Magnus Hallberg

Den var ju betydligt mindre än min, jag ska kolla den.


Svara

Sv:Svår select

Postades av 2007-12-07 10:44:00 - Thomas Vanhaniemi

Har du kommit dig för att testa?


Svara

Sv: Svår select

Postades av 2007-12-08 10:55:55 - Magnus Hallberg

Hej Thomas, jag har tyvärr inte hunnit med det ännu. jag har fått lite andra problem plus att jag har blivit sjuk. Jag återkommer direkt jag har provat det.


Svara

Sv:Svår select

Postades av 2007-12-13 08:47:58 - Magnus Hallberg

Hej Thomas, nu har jag testat och det ser ut som om allt utom @searchWord funkar. Jag ska jobba vidare på det, om du har tid och lust så tar jag gärna mot idéer om hur jag löser det:)


Svara

Sv: Svår select

Postades av 2007-12-13 09:10:25 - Thomas Vanhaniemi

Vad är det som inte fungerar? Returnerar den alltid alla rader?


Svara

Sv:Svår select

Postades av 2007-12-13 09:12:35 - Magnus Hallberg

Detta var märkligt, jag satt och pillade med det och när jag ändrade tillbaka så får jag att det är syntaxfel vid "LIKE". Koden är ju exakt lika som den var innan. vad kan det vara som är fel?

<code>
SELECT ad.approveDate, ad.header, ad.price, lan.lan, cat.category FROM advertises AS ad
INNER JOIN lans AS lan ON ad.lanID = lan.lanID
INNER JOIN categories AS cat ON ad.CategoryID = cat.categoryID
WHERE
ad.isApproved = True AND ad.isPayed = True AND
CASE WHEN @searchWord IS NULL THEN 1 ELSE ad.header LIKE '%' + @searchWord + '%' OR ad.[text] LIKE '%' + @searchWord + '%' END AND
CASE WHEN @lanID = 0 THEN 1 ELSE ad.lanID = @lanID END AND
CASE WHEN @catID = 0 THEN 1 ELSE ad.categoryID = @catID END AND
CASE WHEN @subCatID = 0 THEN 1 ELSE subCategoryID = @subCatID END
ORDER BY ad.approveDate DESC
</code>

EDIT
Jag klistrade in fel, har ändrat det nu. Har sat hakparanteser runt text. Det funkar dock inte ändå, får samma fel


Svara

Sv: Svår select

Postades av 2007-12-13 10:01:36 - Håkan Borneland

Testa med: <b>LIKE '%@searchWord%'</b>

/Håkan


Svara

Sv:Svår select

Postades av 2007-12-13 10:03:59 - Magnus Hallberg

Jag har gjort det, får samma fel då också.


Svara

Sv: Svår select

Postades av 2007-12-13 10:09:50 - Håkan Borneland

Testa med: <b>LIKE '%@searchWord%'</b>

Tittade lite närmare på din sql.
Du kan inte använda CASE satser på det sättet som du gör.
Skall vara: <b>ad.lanID = CASE WHEN @lanID = 0 THEN 1 ELSE @lanID END</b>

/Håkan


Svara

Sv:Svår select

Postades av 2007-12-13 11:35:14 - Magnus Hallberg

När jag har det så här så hämtas inte några resultat nån gång.
<code>
SELECT ad.approveDate, ad.header, ad.price, lan.lan, cat.category FROM advertises AS ad
INNER JOIN lans AS lan ON ad.lanID = lan.lanID
INNER JOIN categories AS cat ON ad.CategoryID = cat.categoryID

WHERE
ad.isApproved = 'True' AND ad.isPayed = 'True' AND
ad.categoryID = CASE WHEN @catID = 0 THEN 1 ELSE @catID END AND
ad.lanID = CASE WHEN @lanID = 0 THEN 1 ELSE @lanID END AND
ad.subCategoryID = CASE WHEN @subCatID = 0 THEN 1 ELSE @subCatID END
--ad.header = CASE WHEN @searchWord IS NULL THEN '' ELSE @searchWord END

ORDER BY ad.choosen DESC, ad.approveDate DESC
</code>


Svara

Sv: Svår select

Postades av 2007-12-13 11:54:04 - Håkan Borneland

Borde bero på hur WHERE villkoren blir sanna.
T.ex om @catID = 0 så blir det ju ad.categoryID = 1, finns den?
O.s.v.

/Håkan


Svara

Sv:Svår select

Postades av 2007-12-13 13:47:24 - Thomas Vanhaniemi

Håkan, du har missuppfattat meningen med CASE satserna. De är fullt giltliga, eftersom om man ger in 0 i någon av variablerna ska just den satsen returnera true (1), annars ska den bara ge true om värdet i databasens fält är samma som variabelns namn.


Svara

Sv:Svår select

Postades av 2007-12-13 13:48:44 - Thomas Vanhaniemi

Håkan, du har missuppfattat meningen med CASE satserna. De är fullt giltliga, eftersom om man ger in 0 i någon av variablerna ska just den satsen returnera true (1), annars ska den bara ge true om värdet i databasens fält är samma som variabelns namn.

Exempel
<code>
CASE WHEN @subCatID = 0 THEN 1 ELSE subCategoryID = @subCatID END
</code>
Om @subCatID = 0, returnera TRUE
Om inte, returnera subCategoryID = @subCatID, alltså true om subCategoryID är samma som @subCatID.


Svara

Sv: Svår select

Postades av 2007-12-13 13:52:07 - Thomas Vanhaniemi

Magnus, du ska ha som jag skrev tidigare. Testa att skriva in ett sökord i SQL frågan direkt och se om det ger något resultat.
Om det inte fungerar måste det felsökas djupare. Vad händer om du helt tar bort den raden som innehåller sökningen? Får du något resultat?


Svara

Sv:Svår select

Postades av 2007-12-13 14:42:00 - Magnus Hallberg

Skriver jag så som du sa så får jag fel "Incorrect syntax near LIKE", tar jag bort den raden får jag felmeddelandet "Incorrect syntax near =".


Svara

Sv:Svår select

Postades av 2007-12-13 14:50:56 - Håkan Borneland

Njaaaaa du Thomas.
Det är nog du som missuppfattat syntaxen på CASE.
Att skriva som du föreslår ger syntaxfel (åtminstone i SQL server).
CASE returnerar bara värden (expressions) beroende på vad WHEN värderas till för boolskt uttryck.
Har haft fel förr, och kan ha det igen (rättar gärna in mig i ledet).
Visa mig ett generellt utryck med CASE som går igenom med syntaxen enligt som du skriver, så är vi överens.

PS. Det är därför Magnus får syntax fel (speciellt felet som säger: <b>Incorrect syntax near =</b>)
Vilket beror på att den inte gillar det boolska uttryck som du föreslår i ELSE satsen. DS.

/Håkan


Svara

Sv: Svår select

Postades av 2007-12-13 15:26:08 - Håkan Borneland

Magnus, om du vill använda LIKE och CASE tillsammans blir det:
<b>ad.header LIKE CASE WHEN @searchWord IS NULL THEN '%' ELSE '%' + @searchWord + '%' END</b>

PS. Förutsätter att då @searchword är Null så vill du visa allt. DS.
/Håkan


Svara

Sv:Svår select

Postades av 2007-12-13 15:35:34 - Thomas Vanhaniemi

Håkan, nu vet jag inte riktigt om SQL Server har några dumma begränsningar, men mitt exempel fungerar utmärkt i MySQL.
Har ingen SQL Server jag nu kan testa på, men jag försår inte varför det inte skulle fungera där också.
Kan ju vara så att MySQL är bättre än SQL Server ;)


Svara

Sv: Svår select

Postades av 2007-12-13 15:58:20 - Håkan Borneland

Hej Thomas,
Nej det fungerar inte i SQL Server.
Är nästan säker på att det är den definitionen som gäller för ANSI SQL.
Tror att MySql har gjort en liten liten egen tolkning/implementation.
Vem som är bäst blir en helt annan tråd ;-)

/Håkan


Svara

Sv:Svår select

Postades av 2007-12-14 05:57:26 - Magnus Hallberg

Nu har jag fäöljande fråg
<code>
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER proc [IsellItAdmin].[getAllNotChooseAdvertiseHeaders]
@lanID int,
@catID int,
@subCatID int,
@searchWord varchar(50) = null
as
set nocount on
declare @errMess varchar(100)

SELECT ad.approveDate, ad.header, ad.price, lan.lan, cat.category FROM advertises AS ad
INNER JOIN lans AS lan ON ad.lanID = lan.lanID
INNER JOIN categories AS cat ON ad.CategoryID = cat.categoryID
WHERE
ad.isApproved = 'True' AND ad.isPayed = 'True' AND
ad.header LIKE CASE WHEN @searchWord IS NOT NULL THEN '%' ELSE '%' + @searchWord + '%' END AND
ad.lanID = CASE WHEN @lanID = 0 THEN 1 ELSE @lanID END AND
ad.categoryID = CASE WHEN @catID = 0 THEN 1 ELSE @CatID END AND
ad.subCategoryID = CASE WHEN @subCatID = 0 THEN 1 ELSE @subCatID END
ORDER BY ad.choosen DESC, ad.approveDate DESC

</code>
På denna fråga får jag inget svar alls. Jag inte visa nåt då @searchWord är null.


Svara

Sv: Svår select

Postades av 2007-12-14 07:03:07 - Thomas Vanhaniemi

Om vi skriver om SQL satsen för att kringgå begränsningen SQL server verkar ha så blir det så här. Vill du inte ha några resultat om @searchWord är NULL? Byt i så fall ut THEN '%' mot THEN ''.
Du har inte raden som söker i texten, så lägg till en sådan också.
<code>
SELECT ad.approveDate, ad.header, ad.price, lan.lan, cat.category FROM advertises AS ad
INNER JOIN lans AS lan ON ad.lanID = lan.lanID
INNER JOIN categories AS cat ON ad.CategoryID = cat.categoryID
WHERE
ad.isApproved = 'True' AND ad.isPayed = 'True' AND
ad.header LIKE CASE WHEN @searchWord IS NULL THEN '%' ELSE '%' + @searchWord + '%' END AND
ad.lanID = CASE WHEN @lanID = 0 THEN ad.lanID ELSE @lanID END AND
ad.categoryID = CASE WHEN @catID = 0 THEN ad.categoryID ELSE @catID END AND
ad.subCategoryID = CASE WHEN @subCatID = 0 THEN ad.subCategoryID ELSE @subCatID END
ORDER BY ad.choosen DESC, ad.approveDate DESC
</code>


Svara

Sv: Svår select

Postades av 2007-12-18 22:56:50 - Thomas Vanhaniemi

Har du hunnit prova senaste än?


Svara

Sv:Svår select

Postades av 2007-12-31 15:51:15 - Magnus Hallberg

Jag har varit bortrest och kom hem igår. Jag har inte hunnit prova ännu. jag kör med den gamla selecten så länge tills jag får tid att sätta mig med detta igen.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
5 734
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies