1

Temat: SELECT ... IF (???)

Uszanowanie wszystkim,

Potrzebuję wyciągnąć z tabeli adresy.
Adresy te mają określone cechy (np. korespondencyjny, stały, siedziby) i określoną wagę tych cech (np. najważniejszy jest korespondencyjny, potem tymczasowy, najmniej ważny inny).
Jak powinno wyglądać zapytanie znajdujące tylko jeden adres o najwyższej wadze?
Czyli - z poniższego przykładu - jak spowodować "wyjście" z CASE po znalezieniu pierwszego pasującego przypadku w kolejności takiej, jak jak to określono poniżej?

SELECT
    btrim(organizacja.nazwa_organiz),
    CASE adres.rodz_adr
        WHEN 'KOR' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
        WHEN 'TYM' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
        WHEN 'STA' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
        WHEN 'ZAM' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
        WHEN 'SIE' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
        WHEN 'INN' THEN split_part(adres.adres_opisowy, ', tel.' , 1)
    END

FROM
    organizacja, adres
WHERE
    organizacja.id = adres.id
ORDER BY
    organizacja.nazwa_organiz

Mam PostgreSQL 8.3, nie może to być funkcja...

Z racji niewielkiego doświadczenia nie mam nawet pojęcia w którym kierunku kombinować hmm

2

Odp: SELECT ... IF (???)

distinct on ci pomoże.

Zasadniczo coś w stylu:

select
distinct on (btrim(...nazwa))
    btrim(...nazwa),
    split_part(..., ..., 1)
from ...
where ...
order by btrim(...nazwa), case adres.rodz_adr
when 'KOR' then 1
when 'TYM' then 2
...
WHEN 'INN' then 6
end
;

--
The best thing about modern society is how easy it is to avoid contact with it.

3

Odp: SELECT ... IF (???)

Działa!

Bardzo dziękuję smile