Anmelden

View Full Version : SQL in where



mk
19-12-17, 12:53
Hi ,

irgendwie verstehe ich gerade etwas nicht.

Folgendes SQL :


select *
from VISITOR01V as a
where
1 = case when :pKUNDENR <> 0 and
KUNDENR = :pKUNDENR then 1

when
:pKUNDENR = 0 and
KundeVertreter = :pKundeVertreter and
Kundestatus = 'A'
and exists ( select plzvon
from tmpPlzTable
where a.kundenplz between plzvon and plzbis) then 1


else 0
end

sagt das Token EXISTS ungültig ist

Das SQL ohne den Case Block

select *
from VISITOR01V as a
where KundeVertreter = :pKundeVertreter
and KundeStatus = :pKundeStatus
and exists ( select plzvon
from tmpPlzTable
where a.kundenplz between plzvon and plzbis) ;
funktioniert.

Ich brauche die Kunden entweder für eine Kundennr,
oder eben alle die in versch. PLZ Bereichen sind.
Die Plz Bereiche von - bis stehen in der tmpPlzTable

Hat jemand eine Idee ?
Gruß
Michael

Fuerchau
19-12-17, 12:59
Leider ist exists nur in einer Where-Klausel und nicht in jedem beliebigen Ausdruck erlaubt.
Daher wird das dann etwas komplizierter mit einem erlaubten skalaren Subselect:

and coalesce(
(select a.kundenplz
from tmpPlzTable
where a.kundenplz between plzvon and plzbis
fetch first rows only), '') = a.kundenplz

mk
19-12-17, 13:06
Hi,

ich habe aber in der tmpPlzTable Tabelle 1-n Sätze für die PLZ. Bereiche
also z.b von 42000-45000
und von 47000-48000
............

Das bekommeich doch so nicht oder ?
Gruß
Michael

Fuerchau
19-12-17, 13:11
Wieso nicht: where a.kundenplz between plzvon and plzbis
Da reicht doch irgendeiner der passt.
Wenn der Subselect nichts findet, dann liefert der NULL, was der Coalesce zu Blank verarztet.
Ist ein gültiger Bereich da, bekommst du deine eigene PLZ zurück, wobei hier ja das 1. Vorkommen reicht, wie bei exists ja auch.

mk
19-12-17, 15:12
Hi Baldur,

danke . So klappt es .

Gruß
Michael