Instrukcja warunkowa dla różnych zapytań

0

Hej
Mam pewien problem, a przyznaje się że z baz danych nie jestem super mocny. Chciałbym zrobić instrukcje warunkową IF ELSE . Z tym że moim celem jest na podstawie spełnienia lub nie spełnia warunku wykonać dwa totalnie różne zapytania SQL. I nie wiem jak skonstruować takie zapytanie, bo przy poniższej strukturze dostaję wyjątek braku Selecta:

WITH
x AS (Select ...)
y AS (Select ...) 
IF (x<y) THEN (Select .... from x)
ELSE (Select ... from x UNION ALL Select ... from y).
END IF
END
0

No to fajnie że dostajesz wyjątek. Zastanawia mnie jednak jaki to wyjątek i w jakiej bazie bo w tym momencie slabo mam ochotę na zgadywanie..

0

Zastanawia mnie jak x może być < y, skoro to są ZBIORY.

0
Szalony Ogórek napisał(a):

Hej
Mam pewien problem, a przyznaje się że z baz danych nie jestem super mocny. Chciałbym zrobić instrukcje warunkową IF ELSE . Z tym że moim celem jest na podstawie spełnienia lub nie spełnia warunku wykonać dwa totalnie różne zapytania SQL. I nie wiem jak skonstruować takie zapytanie, bo przy poniższej strukturze dostaję wyjątek braku Selecta:

WITH
x AS (Select ...)
y AS (Select ...) 
IF (x<y) THEN (Select .... from x)
ELSE (Select ... from x UNION ALL Select ... from y).
END IF
END

Po pierwsze precyzyjniej zdefiniuj, co zwróci select zdefiniowany jako x i y, czy wyniki będą jednowartościowe, czy nie. Jeśli zwracają kilka wierszy, a tak wynika z dalszej części, skoro z nich chcesz robić kolejne selecty, to nie wiadomo, jak chcesz porównać kilkuwierszowe zbiory przez x<y.

Po drugie, upraszczając konstrukcję

if warunek_wyboru_selecta then
  select from costam1 where warunek1
else
  select from costam2 where warunek2
end if

zastąpić przez

select from costam1 where warunek1 and warunek_wyboru_selecta
union all
select from costam2 where warunek2 and not warunek_wyboru_selecta
1

Nie napisałeś w czym to jest więc odpiszę wzorując się na oracle. Jeśli ma to być w takiej formie jak opisałeś to musisz zrobić blok pl/sql w którym takiego if'a sobie złożysz. Natomiast jeśli chcesz zapytanie to ja proponuję coś takiego:

with s as (select 'aaa' test, id from tabela),
        t as (select 'bbb' test, id from tabela2)
select coalesce(s,test, t.test) test from tabela3 u
left outer join u.id = s.id and <<tu podajesz swoje warunek>>
left outer join u.id = t.id and <<tu podajesz warunek przeciwny>>

mniej więcej coś takiego powinno wystarczyć

0

@kate87 dostaję wyjątek, że nie mam SELECTA. Dodaję go, to żąda FROM. A nie wiem co mam tu wpisać, skoro on w przypadku spełnienia warunku ma wykonać polecenie SQL z danej tablicy.
@Marcin.Miga sorry, pisałem na szybko. Oczywiście chodziło mi o zmienne dla x i y.
@zimny Szczur Twoje zapytanie jest spoko, problem jest jedynie, że dla "AND NOT warunek_wyboru_selecta" nie widzi mi zmiennej.
@woolfik Tak, używam Oracla. W Twoim zapytaniu mam o tyle problem, że dla każdego mojego zapytania pobieram różne zmienne z dwóch różnych tabel.

Poprawiam strukturę, bo pisałem na szybo. Może będzie lepiej widoczne o co mi chodzi (szczególnie, że niestety kiepsko tłumaczę to :-/) :

WITH
x AS (Select a1, a2 FROM  ...)
y AS (Select a1, a2 FROM  ...) 
IF (x.a1<y.a2) THEN (Select x.a1, x.a2  from x, y WHERE x.a1<y.a2)
ELSE (Select sum(a1), sum(a2)  from( Select a1, a2 from x UNION ALL Select a1, a2 from y)).
END IF
END
0
Szalony Ogórek napisał(a):
WITH
x AS (Select a1, a2 FROM  ...)
y AS (Select a1, a2 FROM  ...) 
IF (x.a1<y.a2) THEN (Select x.a1, x.a2  from x, y WHERE x.a1<y.a2)
ELSE (Select sum(a1), sum(a2)  from( Select a1, a2 from x UNION ALL Select a1, a2 from y)).
END IF
END

nie ułatwiasz mi zadania ale spróbujmy...

with s as (select x.a1, x.a2 from x, y where x.a1 < y.a2),  
        t as (Select sum(a1) a1, sum(a2) a2 from( Select a1, a2 from x UNION ALL Select a1, a2 from y))
select s.a1, s.a2 from s
union
select t.a1, t.a2 from t where not exists  (select 1 from s) 

teorytycznie - bo nie miałem jak sprawdzić pierwszy union ma warunek a1 < a2 więc not exists z uniona powinien załatwić tego if'a ... niestety bez dodatkowych danych / struktury / przykładowego zestawu danych ciężko coś na sucho więcej podpowiedzieć. Pytanie potrzebujesz to jako select do zmiennej czy zestaw danych na podstawie, którego coś będziesz robić? Zastanawiam się nad procedurą PL/SQL

0
Szalony Ogórek napisał(a):
WITH
x AS (Select a1, a2 FROM  ...)
y AS (Select a1, a2 FROM  ...) 
IF (x.a1<y.a2) THEN (Select x.a1, x.a2  from x, y WHERE x.a1<y.a2)
ELSE (Select sum(a1), sum(a2)  from( Select a1, a2 from x UNION ALL Select a1, a2 from y)).
END IF
END

Przecież to Ci się ciągle nie trzyma kupy.
Jeśli wynikiem x jest np:
a1 a2
1 2
3 4
5 6

a wynikiem y np:
a1 a2
7 2
9 10

to które wartości z chcesz porównać w
IF (x.a1<y.a2)
?

1 użytkowników online, w tym zalogowanych: 0, gości: 1