1

Temat: Zwrócenie stringu z funkcji

Witam
Select * from tabela where uzytkownik = 'jola';   działa

Potrzebuje funkcję która zwróci mi tego użytkownika do porównania

CREATE OR REPLACE FUNCTION atest (pracownik integer)
RETURNS varchar AS
$body$
begin
    return '''jola''';
  end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;

select * from atest(1)   zwraca wynik   'jola'
ale
Select * from tabela where uzytkownik =atest (1);   nic nie zwraca

Próbowałem też tak, ale również nic nie zwraca
Select * from tabela where uzytkownik = quote_literal(atest(1))

Select * from tabela where uzytkownik = '||quote_literal(jola)||'  też nic nie zwraca

Nie wiem dlaczego tak jest

W przyszłości chciałbym napisać funkcję (funkcja1(coś tam)) która zwróciła by np taki wynik w zależności od warunków:

= 'jola';
like '%ol%';

ja podstawiał bym tylko funkcje do zapytania

Select * from tabela where uzytkownik funkcja1(coś tam)
Było by np Select * from tabela where uzytkownik = 'jola';

Select * from tabela where uzytkownik funkcja1(coś tam)
Było by np Select * from tabela where uzytkownik like '%ol%';

Może ktoś mnie pokieruje jak to rozwiązać
Z góry dzięki

2

Odp: Zwrócenie stringu z funkcji

Witam,

Spróbuj zmienić w funkcji 
return '''jola''';
na
return 'jola';

3

Odp: Zwrócenie stringu z funkcji

Mam dwa pytania:
1. Czy pole  "uzytkownik" w tabeli tabela przechowuje nazwę jola czy jola w pojedyńczym cudzysłowie
jeśli wartość przechowywana nie zawiera cudzysłowu to twoja funkcja powinna zwracać RETURN 'jola';

2 czy to pole przechowuje nazwy użytkownika pisane samymi małymi literami?
Jeśli nie to powinno się napisać Select * from tabela where upper(uzytkownik) =upper(atest (1));

Sprawdź jeszcze czy nie masz w polu użytkownik spacji na końcu lub na początku

4

Odp: Zwrócenie stringu z funkcji

5

Odp: Zwrócenie stringu z funkcji

musi działać - zobacz poniższy skrypt, działa jak tra la la smile:)

create table tabela (
id serial primary key
,uzytkownik varchar(50) not null
);
CREATE OR REPLACE FUNCTION atest (pracownik integer)
RETURNS varchar AS
$body$
begin
    return 'jola';
  end;
$body$
LANGUAGE 'plpgsql';

insert into tabela(uzytkownik) values ('jola'),('magda'),('paweł');

Select * from tabela where uzytkownik=atest(1);

6

Odp: Zwrócenie stringu z funkcji

7

Odp: Zwrócenie stringu z funkcji

LIKE to polecenie SQL więc zmien w funkcji linie z RETURN na RETURN '%jola%';
a następnie wykonaj swój select

Select * from schemat.tabela where uzytkownik like schemat.atest(1);

8

Odp: Zwrócenie stringu z funkcji

9

Odp: Zwrócenie stringu z funkcji

można i to osiągnąć - napisz funkcje jak niżej (popraw w niej schemat na taki jaki wykorzystujesz


CREATE OR REPLACE FUNCTION public.f_tabela(id integer,prefix varchar(1),sufix varchar(1)) RETURNS SETOF public.tabela AS
$BODY$
DECLARE
    r  public.tabela;
BEGIN
    raise notice 'SQL wyglada tak %','SELECT * FROM public.tabela WHERE uzytkownik '||case when length(coalesce(prefix,'')||coalesce(sufix,''))=0 then '=''jola''' else 'ilike '''||coalesce(prefix,'')||'jola'||coalesce(sufix,'')||'''' end;
    FOR r IN execute 'SELECT * FROM public.tabela WHERE uzytkownik '||case when length(coalesce(prefix,'')||coalesce(sufix,''))=0 then '=''jola''' else 'ilike '''||coalesce(prefix,'')||'jola'||coalesce(sufix,'')||'''' end
    LOOP
        RETURN NEXT r;
    END LOOP;
    RETURN;
END
$BODY$
LANGUAGE 'plpgsql' ;

select * from f_tabela(1,'%','%')
union all select * from f_tabela(1,'%',null)
union all select * from f_tabela(1,null,'%')
union all select * from f_tabela(1,null,null)

Ostatnio edytowany przez c_michal (2013-06-21 14:59:58)

10

Odp: Zwrócenie stringu z funkcji

Dzięki, fajnie działa
zmieniłem pierwszy parametr na "nazwa varchar" i w funkcji wpis

case when length(coalesce(prefix,'')||coalesce(sufix,''))=0 then '='''||nazwa||'''' else 'like '''||coalesce(prefix,'')||nazwa||coalesce(sufix,'')||'''' end

Wywołuje np tak
select * from f_tabela('a','%','%')  wyszukuje uzytkowników z literką 'a' (like '%a%')

Jeszcze raz dzięki