Jag vill kunna använda % wildcard i kombination med COALESCE, men får det inte att fungera. Jag undrar vad du vill uppnå med detta Det jag vill uppnå är ett dynamiskt WHERE villkor där jag kan använda mig av % som wildcard Testa: Gick inte heller :( Skumt.. har ingen aning faktiskt.. Hej Daniel! Detta är ett alternativ: Andreas: Den lösningen fungerade!COALESCE och % wildcard
Följande resulterar i 0 träffar
declare @test as char(5)
set @test = '%@%'
select contactid from contact where mailadress LIKE COALESCE(@test, mailadress)
samma resultat om jag skriver på följande sätt:
declare @test as char(5)
set @test = '@'
select contactid from contact where mailadress LIKE COALESCE('%'+@test+'%', mailadress)
Följande fungerar dock:
declare @test as char(5)
set @test = '%@%'
select contactid from contact where mailadress LIKE @test
Är det helt enkelt så att % och COALESCE kombinationen inte fungerar i MS SQL 7.0 eller ska man skriva på nått annat sätt?
Sv: COALESCE och % wildcard
COALESCE ('@', B) returnerar det första icke null uttrycket dvs här kommer det alltid returnera '@' så vad behöver du det till?
Men samtidigt tycke jag att det bör funka
En vild gissning: konvertera resultatet från COALESCE till varchar
CAST(COALESCE(@test, mailadress) AS varchar(100))
Testade på SQL2005 å där funkade det bra, så det kanske är nåt med SQL7 då.Sv: COALESCE och % wildcard
Jag har en stored procedure som ser ut på följande sett och i denna utformning fungerar den som tänkt:
CREATE PROCEDURE [GetRecepient]
@Project as integer = null,
@Status as integer = null,
@WantsInspire as integer = null,
@Mailadress as char(5) = null
AS
if @Mailadress is null
begin
SELECT ContactID, Contact, Company, Town FROM Contact WHERE ProjectID = COALESCE(@Project, ProjectID) AND StatusID = COALESCE(@Status, StatusID) AND WantsInspire = COALESCE(@WantsInspire, WantsInspire)
end
else
begin
SELECT ContactID, Contact, Company, Town FROM Contact WHERE ProjectID = COALESCE(@Project, ProjectID) AND StatusID = COALESCE(@Status, StatusID) AND WantsInspire = COALESCE(@WantsInspire, WantsInspire) AND Mailadress LIKE @Mailadress
end
Det jag nu vill är att göra samma sak fast i en och samma SQL sats, typ så här:
CREATE PROCEDURE [GetRecepient]
@Project as integer = null,
@Status as integer = null,
@WantsInspire as integer = null,
@Mailadress as char(5) = null
AS
SELECT ContactID, Contact, Company, Town FROM Contact WHERE ProjectID = COALESCE(@Project, ProjectID) AND StatusID = COALESCE(@Status, StatusID) AND WantsInspire = COALESCE(@WantsInspire, WantsInspire) AND Mailadress LIKE COALESCE(@Mailadress, Mailadress)
Alltså om @Mailadress = null så tar den med alla värden i kolumnen, men om @Mailadress != null så söker den på värdet i @Mailadress,
och här vill jag kunna använda mig av '%' vilket jag inte fått att fungera.
CAST(COALESCE(@test, mailadress) AS varchar(100)) fungerade inte, tyvärr.
Det kanske helt enkelt bara är en begränsing i 7:an...
Sv:COALESCE och % wildcard
CREATE PROCEDURE [GetRecepient]
@Project as integer = NULL,
@Status as integer = NULL,
@WantsInspire as integer = NULL,
@Mailadress as varchar(50) = NULL
AS
SET NOCOUNT ON
SET @Mailadress = '%' + @Mailadress + '%'
SELECT ContactID, Contact, Company, Town FROM Contact
WHERE ProjectID = COALESCE(@Project, ProjectID)
AND StatusID = COALESCE(@Status, StatusID)
AND WantsInspire = COALESCE(@WantsInspire, WantsInspire)
AND Mailadress LIKE COALESCE(@Mailadress, Mailadress)
//Håkan
Sv: COALESCE och % wildcard
det fungerar om man anger en hel mailadress:
@Mailadress = 'testing@mailadress.com'
men @Mailadress = @ ger inga träffar...
Det är som om den bara ignorerar %-tecknenSv:COALESCE och % wildcard
Men en alternativ lösning på samma princip är följande.
WHERE (StatusID = @Status OR @Status IS NULL)
dvs: om StatusID ej skickas med så är det null och då
vinner 'NULL IS NULL' och villkoret tas ej med i urvalet.Sv:COALESCE och % wildcard
Har provkört ovanstående som jag postade, det fungerar även med bara @.
Dock bara i QA.
Frågan är vad du får in för värden från din app.
Provade du att köra exakt det som jag skrev ovan, eller?
//HåkanSv:COALESCE och % wildcard
CREATE PROCEDURE [GetRecepient]
@Project as integer = null,
@Status as integer = null,
@WantsInspire as integer = null,
@Mailadress as varchar(5) = null
AS
SELECT ContactID, Contact, Company, Town
FROM Contact
WHERE (@Project IS NULL OR ProjectID = @Project) AND
(@Status IS NULL OR StatusID = @Status) AND
(@WantsInspire IS NULL OR WantsInspire = @WantsInspire) AND
(@Mailadress IS NULL OR Mailadress LIKE @Mailadress)
Skulle vara interesant att veta om någon känner till hur SQL servern optimerar vilkoren.
Om en parameter skulle vara null är ju detta konstant för alla rader. Skulle inte frågemotorn då kunna förenkla bort några av staserna?
Sv: COALESCE och % wildcard
Håkan: Jag provade din lösning (Copy - Paste) och skickade bara in @, men fick det inte att fungera, tyvärr
Ola: Din lösning fungerade så länge man skickade in något, men @Mailadress = null resulterade i 0 träffar
Tack så mycket för all hjälp!
/Daniel