if w zapytaniu select
Maciej Misiak - 13-11-2006 00:47
if w zapytaniu select
Witam, Czy jest możliwość użycia instrukcji warunkowej w zapytaniu select? Chodzi mi o takie zagadnienie:
create table aaa ( wsp1 numeric(7,2), wsp2 numeric(7,2), take_first boolean, id_mnoznika integer references mnozniki );
create table mnozniki ( id serial primary key, m1 numeric(7,2), m2 numeric(7,2) );
Wynik, który chcę uzyskać, to: if(take_first) return wsp1 * m1; else return wsp2 * m2;
Początek zapytania jest oczywisty:
SELECT m1, m2, wsp1, wsp2, take_first FROM aaa JOIN mnozniki ON id_mnoznika = id where id = ...;
Rozszerzenie o obliczenia pośrednie również proste:
SELECT m1 * wsp1, m2 * wsp2, take_first FROM aaa JOIN mnozniki ON id_mnoznika = id where id = ...;
I tu muszę użyć np. plsql aby zrobić ifa: SELECT INTO tf take_first FROM aaa JOIN mnozniki ON id_mnoznika = id where id = ...; IF tf = true THEN SELECT INTO ret_val m1 * wsp1 FROM aaa JOIN mnozniki ON id_mnoznika = id where id = ...; ELSE SELECT INTO ret_val m2 * wsp2 FROM aaa JOIN mnozniki ON id_mnoznika = id where id = ...; END IF
Można to zrobić selectem?
-- grizzley
hubert depesz lubaczewski - 13-11-2006 00:47
On 2006-11-05, Maciej Misiak <grizzley@poczta.onet.pl> wrote: > Można to zrobić selectem?
jaka to baza danych?
depesz
-- mój boże, spraw abym milczał, dopóki się nie upewnię, że naprawdę mam coś do powiedzenia. (c) 1998 depesz
Adam Buraczewski - 13-11-2006 00:47
Maciej Misiak <grizzley@poczta.onet.pl> wrote: > Czy jest możliwość użycia instrukcji warunkowej w zapytaniu select?
Nie napisałeś o jaką bazę danych chodzi, ale najwyraźniej chodzi Ci o CASE. Składnia (z dokumentacji PostgreSQLa):
http://www.postgresql.org/docs/8.1/s...nditional.html
Polecam także inne konstrukcje SQL opisane w tym rozdziale.
Pozdrawiam!
-- Adam Buraczewski <adamb (at) nor (dot) pl> * Linux user #165585 GCS/TW d- s-:+>+:- a C+++(++++) UL++++$ P++ L++++ E++ W+ N++ o? K w-- O M- V- PS+ !PE Y PGP+ t+ 5 X+ R tv- b+ DI D G++ e+++>++++ h r+>++ y?
Wito - 13-11-2006 00:47
Nie wiem czy to rozwiąże twój problem ale może tak. Gdybuś zrobił to w 2 selectach połączonych UNION. Każdy z nich zawierałby dodatkową kolumnę która zawierałaby wynik działania.
Przykład: SELECT A.wsp1, A.wsp2, A.take_first, A.id_mnozniki, [dodatkowa_kolumna]
FROM aaa A WHERE take_first is null AND [dodatkowa_kolumna] = wsp1 * (select m1 from mnozniki where id=A.idmnozniki)
UNION
SELECT A.wsp1, A.wsp2, A.take_first, A.id_mnozniki, [dodatkowa_kolumna]
FROM aaa A WHERE take_first is not null AND [dodatkowa_kolumna] = wsp2 * (select m2 from mnozniki where id=A.idmnozniki)
W ten sposób w [dodatkowej kolumnie] powinny znaleźć się odpowiednie wartości w zależności od tego czy cos sie znajduje w take_fisrt czy tez nie. Powyższe zapytanie nie było testowane!!! Jeżeli chcesz je wykorzystać to powinieneś zrobić z tego widok (jeżeli się da to zrobić) Czy o to chodzilo?
Wito
Maciej Misiak - 13-11-2006 00:47
> Maciej Misiak <grizzley@poczta.onet.pl> wrote: > > Czy jest możliwość użycia instrukcji warunkowej w zapytaniu select? > > Nie napisałeś o jaką bazę danych chodzi, ale najwyraźniej chodzi Ci o > CASE. Składnia (z dokumentacji PostgreSQLa): > > http://www.postgresql.org/docs/8.1/s...nditional.html > > Polecam także inne konstrukcje SQL opisane w tym rozdziale.
PostgreSQL, ale sądziłem, że to niezależne od bazy, więc rozmyślnie nie podałem. CASE będzie odpowiedni, dzięki.
-- grizzley
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Maciej Misiak - 13-11-2006 00:47
> Nie wiem czy to rozwiąże twój problem ale może tak. Gdybuś zrobił > to w 2 selectach połączonych UNION. <...> > Czy o to chodzilo?
Obecnie (czyli przy jednym if-ie) wystarczy mi zwykły CASE, ale niedługo natknę się na zagnieżdżone warunki i wtedy UNION się przyda, dzięki.
-- grizzley
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.plquentinho.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|