<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Zwrócenie stringu z funkcji]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=1861&amp;type=atom"/>
	<updated>2013-06-24T06:08:03Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=1861</id>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4621#p4621"/>
			<content type="html"><![CDATA[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]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2013-06-24T06:08:03Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4621#p4621</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4614#p4614"/>
			<content type="html"><![CDATA[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)]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-06-21T12:54:30Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4614#p4614</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4613#p4613"/>
			<content type="html"><![CDATA[[quote=c_michal]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);[/quote]

Działa, może za dużo wymagam, ale tak sobie wymyśliłem, że funkcja mogła by być uniwersalna i w zależności od warunków zwracać np:
= 'jola';
lub 
like '%jola';

a zapytanie było by zawsze stałe, bez = lub like w zapytaniu

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

Dzięki za pomoc]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2013-06-21T11:56:44Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4613#p4613</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4612#p4612"/>
			<content type="html"><![CDATA[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);]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-06-21T11:44:30Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4612#p4612</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4611#p4611"/>
			<content type="html"><![CDATA[[quote=c_michal]musi działać - zobacz poniższy skrypt, działa jak tra la la :):)
[/quote]

Już działa, problem był w schematach (akurat tutaj ich nie pokazałem), ale przy tabeli był schemat, a przy funkcji nie. Twój przykład zadziałał i mój też. Dlatego kapnąłem się że schemat tutaj miesza. Teraz podaję tabelę i funkcję ze schematem.

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

Idąc dalej zmieniłem funkcję na 

CREATE OR REPLACE FUNCTION atest (pracownik integer)
RETURNS varchar AS
$body$
begin
    return 'like ''%jola%''';

---return '= ''jola'''; -- tez nie dziala
  end;
$body$
LANGUAGE 'plpgsql';

select * from schemat.atest(1)   zwraca wynik  like '%jola%'
ale 
Select * from schemat.tabela where uzytkownik schemat.atest(1); nic nie zwraca tylko że jest błąd przy schemacie funkcji.]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2013-06-21T11:23:06Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4611#p4611</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4610#p4610"/>
			<content type="html"><![CDATA[musi działać - zobacz poniższy skrypt, działa jak tra la la :):)

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);]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-06-21T10:36:53Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4610#p4610</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4609#p4609"/>
			<content type="html"><![CDATA[[quote=sekol]Witam,

Spróbuj zmienić w funkcji  
return '''jola'''; 
na 
return 'jola';[/quote]

Nic to nie daje

c_michal
Użytkownik jest bez spacji, cudzysłowi itp
wszystko jest małymi literami

funkcja zwraca 'jola'

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

To nie działa,column "jola" does not exist

Select * from tabela where uzytkownik = jola;
Select * from tabela where uzytkownik = "jola";

pole uzytkownik jest varchar]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2013-06-21T09:51:34Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4609#p4609</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4608#p4608"/>
			<content type="html"><![CDATA[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]]></content>
			<author>
				<name><![CDATA[c_michal]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=627</uri>
			</author>
			<updated>2013-06-21T09:21:12Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4608#p4608</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4607#p4607"/>
			<content type="html"><![CDATA[Witam,

Spróbuj zmienić w funkcji  
return '''jola'''; 
na 
return 'jola';]]></content>
			<author>
				<name><![CDATA[sekol]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=71</uri>
			</author>
			<updated>2013-06-21T09:10:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4607#p4607</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Zwrócenie stringu z funkcji]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=4606#p4606"/>
			<content type="html"><![CDATA[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]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2013-06-21T07:23:49Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=4606#p4606</id>
		</entry>
</feed>
