Bedingungen in Join Abfrage

Hallo WeWeWaler

Ich benutze für eine Suche Join Abfragen. Allerdings benötige ich zwei „äußere“ und je zwei „innere“ Varianten, also alles in allem vier Varianten. Das Statement ist im wesenlichen gleich nur ein Where und eine Feld ändert sich.

Bisher habe ich das Statement über if () geschachtelt, was auch so funktionert, aber nicht gerade pflegeleicht ist. Erste Idee war es, im Join ein if () zu verwenden, was wohl nicht geht oder nicht hinbekommen habe.

Welche Alternativen habe ich?

mfg

Dirk

Hallo Dirk!

Ich benutze für eine Suche Join Abfragen. Allerdings benötige
ich zwei „äußere“ und je zwei „innere“ Varianten, also alles
in allem vier Varianten. Das Statement ist im wesenlichen
gleich nur ein Where und eine Feld ändert sich.

Bisher habe ich das Statement über if () geschachtelt, was
auch so funktionert, aber nicht gerade pflegeleicht ist. Erste
Idee war es, im Join ein if () zu verwenden, was wohl nicht
geht oder nicht hinbekommen habe.

Hmpf. Da müsste man schon mal Dein bisheriges SQL-Statement sehen. Anstelle der Joins kannst Du auch mit Exists/Any oder In arbeiten oder auf dem gesamten kartesischen Produkt selektieren, nur um alternative Möglichkeiten zu nennen. Wird irgendwann sicherlich vor allem eine Performancefrage.

Aber wie heißt es so schön: Make it work before you make it fast.

Gruß, Manfred

Hallo Manfred!

erstmal danke für die Antwort. Da das ganze etwas länglich ist wollte ich erst die Stored Procedure nicht posten, aber was solls. Du findest sie am Ende meiner Antwort.

if (@lang = ‚deu‘)
begin
if (@resp + @coop + @info = ‚‘)
–select mit where xmlSearch like @contains else
–select wie vor und … or (xmlSearch like @resp …)
end
if (@lang = ‚eng‘)end
if (@resp + @coop + @info = ‚‘)
–select mit where xmlSearch_eng like @contains else
–select wie vor und … or (xmlSearch_eng like @resp …)
end

Es werden also zwei Aussagen abgefragt: Sprache (könnten auch mal mehr werden …) und die Parameter, die speziellle „Suchtexte“ beinhalten. DIe SP funzt wie unten angegeben. Allerings bei „n“ Sprachen macht es keinen Spass das zu pflegen.

Im ersten Abschnitt verwende ich „xmlSearch“. Den könnte ich mir auch gut als „xmlSearch_deu“ vorstellen. (Hätte man direkt machen sollen). Dann könnte man die Spalte aus „xmlSearch_“ + l bilden. Aber dann?

mfg

Dirk

CREATE PROCEDURE listActivitiesCS
@contains nvarchar(200),
@resp nvarchar(200),
@coop nvarchar(200),
@info nvarchar(200),
@lang nvarchar(200)

AS
set @contains = ‚%‘ + upper(@contains) +’%’

if (@resp ‚‘)
set @resp = ‚%‘ + @resp +’%’
if (@coop ‚‘)
set @coop = ‚%‘ + @coop +’%’
if (@info ‚‘)
set @info = ‚%‘ + @info +’%’

set @contains = ‚%‘ + upper(@contains) +’%’

if (@resp ‚‘)
set @resp = ‚%‘ + @resp +’%’
if (@coop ‚‘)
set @coop = ‚%‘ + @coop +’%’
if (@info ‚‘)
set @info = ‚%‘ + @info +’%’

if (@lang = ‚deu‘)
begin
if (@resp + @coop + @info = ‚‘)
select c.xmlStream as xmlStream, c.id as id, c.orderNumber as actOrder, titel as titel, d.treeOrder as procOrder, d.id as chapterId from Processes as d
right outer join
(
select b.xmlStream, b.id, a.orderNumber, processId from activitiesToProcesses as a
right outer join actcache as b
on b.Id = a.activityId
where xmlSearch like @contains or xmlSearch_eng like @contains
) as c
on c.processId = d.Id
where isnull(d.treeOrder,-1) -1
order by procOrder, actOrder
else
–das ist der Unterschied zu oben!
select c.xmlStream as xmlStream, c.id as id, c.orderNumber as actOrder, titel as titel, d.treeOrder as procOrder, d.id as chapterId from Processes as d
right outer join
(
select b.xmlStream, b.id, a.orderNumber, processId from activitiesToProcesses as a
right outer join actcache as b
on b.Id = a.activityId
where (xmlSearch like @contains or xmlSearch_eng like @contains)and (xmlSearch like @resp or xmlSearch like @coop or xmlSearch like @info)
) as c
on c.processId = d.Id
where isnull(d.treeOrder,-1) -1
order by procOrder, actOrder
end
if (@lang = ‚eng‘)
begin
if (@resp + @coop + @info = ‚‘)
select c.xmlStream_eng as xmlStream, c.id as id, c.orderNumber as actOrder, titel_eng as titel, d.treeOrder as procOrder from Processes as d
right outer join
(
select b.xmlStream_eng, b.id, a.orderNumber, processId from activitiesToProcesses as a
right outer join actcache as b
on b.Id = a.activityId
where xmlSearch like @contains or xmlSearch_eng like @contains
) as c
on c.processId = d.Id
where isnull(d.treeOrder,-1) -1
order by procOrder, actOrder
else
–das ist der Unterschied zu oben!
select c.xmlStream_eng as xmlStream, c.id as id, c.orderNumber as actOrder, titel_eng as titel, d.treeOrder as procOrder from Processes as d
right outer join
(
select b.xmlStream_eng, b.id, a.orderNumber, processId from activitiesToProcesses as a
right outer join actcache as b
on b.Id = a.activityId
where (xmlSearch like @contains or xmlSearch_eng like @contains)and (xmlSearch like @resp or xmlSearch like @coop or xmlSearch like @info)
) as c
on c.processId = d.Id
where isnull(d.treeOrder,-1) -1
order by procOrder, actOrder
end
GO