Witam,
męczę się z następującym problemem - wykonuję jakiegoś prostego SELECTa do bazy i chcę zwrócić wynik w formacie JSON (od bodajże wersji postgreSQL 9.3 jest to dostępne..). To wszystko działa w porządku. Sprawa komplikuje się jak chcę wykorzystać warunek IF..ELSE, gdyż w przypadku procedury składowanej, w której wykorzystuje się funkcję row_to_json()
zwracającą JSONa wymagane jest użycie języka SQL
. Natomiast w przypadku polecenia IF..ELSE wymagane jest użycie PL/pgSQL
, z tym że wtedy nie działają mi funkcje związane z JSONem.. -.-
Ogólnie patowa sytuacja.. Chyba, że można jakoś na około dojść do ostatecznego celu tego zapytania. Na ten moment to wygląda tak:
CREATE OR REPLACE FUNCTION "schema1"."somefunction"(serialnumber character varying)
RETURNS json AS
$BODY$
SELECT row_to_json(t) FROM (
SELECT "col1","col2","col3","col4"
FROM "schema1"."tab1"
WHERE (SELECT "d1" FROM "schema1"."Dtab" WHERE "SN" = serialnumber) = ANY("col5_array")
) t;
$BODY$
LANGUAGE SQL ;
W 'normalnych' procedurach składowanych wykorzystywałem wyrażenie IF EXISTS (SELECT (1) FROM ...)
no, ale w opisanym wyżej przypadku to nie chce funkcjonować..
Ogólnie efekt końcowy jaki chciałbym osiągnąć to do tego kodu co jest wyżej zrobić warunek, że jeżeli nie znajdzie wyników dla danego *serialnumber *to ma wyrzucić pewne 'stałe' dane, np coś takiego:
SELECT '{"data": "not found"}'::json;
Może ktoś z Was miał okazje robić coś podobnego..
pzdr,
M
ps. Kombinowałem coś z warunkiem CASE WHEN, ale ostatecznie nie otrzymałem pożądanych efektów.