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. 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: Tror något i stil med denna fråga kan lösa problemet åt dig 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. 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:) 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? Testa med: <b>LIKE '%@searchWord%'</b> När jag har det så här så hämtas inte några resultat nån gång. Borde bero på hur WHERE villkoren blir sanna. 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. 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. 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. 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 =". Njaaaaa du Thomas. Magnus, om du vill använda LIKE och CASE tillsammans blir det: Håkan, nu vet jag inte riktigt om SQL Server har några dumma begränsningar, men mitt exempel fungerar utmärkt i MySQL. Hej Thomas, Nu har jag fäöljande fråg 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 ''. 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.Svår select
Sv: Svår select
<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.Sv:Svår select
<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>Sv: Svår select
Sv:Svår select
Sv:Svår select
<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 felSv: Svår select
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åkanSv:Svår select
<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>Sv: Svår select
T.ex om @catID = 0 så blir det ju ad.categoryID = 1, finns den?
O.s.v.
/HåkanSv:Svår select
Sv:Svår select
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.Sv: Svår select
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?Sv:Svår select
Sv:Svår select
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 Sv: Svår select
<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åkanSv:Svår select
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 ;)Sv: Svår select
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åkanSv:Svår select
<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.Sv: Svår select
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>Sv:Svår select