Search функция в RostgreSQL

10 отговора 646 прегледа
#1

Search функция в RostgreSQL

Искам да направя Search функция, в която да се конструира заявката в зависимост от това дали някои параметър е NULL или не и накрая тази заявка да се изпълни.
Ако не се прави така то по какъв друг начин да го направя?

Отговор
в отговор на Maнoл4o #2

Re: Search функция в RostgreSQL

Нещо не мога да схвана какво точно искаш да направиш. Можеш ли да дадеш примерно извикване на тази фукнция и примерната заявка, която да връща?

Everything louder than everything else...
Отговор
в отговор на Dakota #3

Re: Search функция в RostgreSQL

CREATE OR REPLACE FUNCTION sp_company_search(varchar, int4)
RETURNS SETOF company_with_address_data AS
$BODY$

SET sqlquery = 'SELECT * FROM companies WHERE 1 = 1 ';

SELECT $1,
CASE WHEN $1 NOTNULL THEN sqlquery = sqlquery + ' AND (name LIKE ''%'+ $1 +'%'')'
END

SELECT $2,
CASE WHEN $2 NOTNULL THEN sqlquery = sqlquery + ' AND (countryid ='+ $2 +')'
END

EXECUTE sqlquery

$BODY$
LANGUAGE 'sql' VOLATILE;
ALTER FUNCTION sp_company_search(varchar, int4) OWNER TO postgres;


Разбира се тази функция не е синтактично вярна, но така само описвам как си я представям!

Отговор
в отговор на Maнoл4o #4

Re: Search функция в RostgreSQL

Ако съм те разбрал правилно ако параметрите не са NULL филтрираш и по тях ако не връщаш всичко. Plpgsql но това няма значение.

CREATE OR REPLACE FUNCTION sp_dummy(varchar, integer) RETURNS SETOF company_with_address_data
AS '
DEFINE
p_name ALIAS FOR $1;
p_countryid ALIAS FOR $2;

r_data company_with_address_data;
BEGIN

FOR r_data IN
SELECT * FROM companies
WHERE (name LIKE ''%'' || p_name || ''%'' OR p_name IS NULL) AND (countryid = p_countryid OR p_countryid IS NULL)
LOOP
RETURN NEXT r_data;
END LOOP;

RETURN;
END
' LANGUAGE plpgsql VOLATILE;

Отговор
в отговор на Maнoл4o #5

Re: Search функция в RostgreSQL

То горе-долу си е обяснено в документацията доста добре, но ето:

CREATE OR REPLACE FUNCTION sp_company_search(varchar, int4)

RETURNS SETOF companies AS
'
DECLARE
name ALIAS FOR $1;
countryid ALIAS FOR $2;
temprow companies%ROWTYPE;
query text := ''SELECT * FROM companies WHERE true'';
BEGIN
IF ($1 IS NOT NULL) THEN
query := query || '' AND name LIKE ''''%'' || name || ''%'''''';
END IF;
IF ($2 IS NOT NULL) THEN
query := query || '' AND countryid = '' || countryid;
END IF;

FOR temprow IN EXECUTE query LOOP
RETURN NEXT temprow;
END LOOP;
RETURN;
END;
'
LANGUAGE 'plpgsql' VOLATILE;


Надявам се, че не си имал предвид RostgreSQL, а PostgreSQL все пак?

Everything louder than everything else...

Редактирано от Dakota на

Отговор
в отговор на seeker #6

Re: Search функция в RostgreSQL

syntax error at or near "DEFINE" at character 96

Излезе такава грешка, и аз нещо не мога да се ориентирам.

Отговор
в отговор на Dakota #7

Re: Search функция в RostgreSQL

Получи се следната грешка:

ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "sp_company_search1" line 15 at return next

Отговор
в отговор на seeker #8

Re: Search функция в RostgreSQL

Замених DEFINE с DECLARE ама сега излезе друг проблем:

ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "sp_company_search2" line 12 at return next

Отговор
в отговор на seeker #9

Re: Search функция в RostgreSQL

извинявай DECLARE е

писах я без да я тествам понеже не бях сигурен дали това искаш
виж си типа на company_with_address_data и коригирай select-а
предполагам тази грешка е заради несъвместими типове

Отговор
в отговор на seeker #10

Re: Search функция в RostgreSQL

Предполагам че трябва да е нещо такова, но пак не става!

CREATE OR REPLACE FUNCTION sp_company_search2(varchar, integer) RETURNS SETOF companies
AS
' DECLARE
p_name ALIAS FOR $1;
p_countryid ALIAS FOR $2;

r_data companies;
BEGIN

FOR r_data IN
SELECT * FROM companies
WHERE (name LIKE ''%'' || p_name || ''%'' OR p_name IS NULL) AND (id = p_countryid OR p_countryid IS NULL)
LOOP
RETURN NEXT r_data;
END LOOP;

RETURN;
END
' LANGUAGE plpgsql VOLATILE;

Отговор
в отговор на Maнoл4o #11

Re: Search функция в RostgreSQL

Ти нали я извикваш като SELECT * FROM sp_company_search(null, null); ?

Everything louder than everything else...
Отговор