Search функция в RostgreSQL
10 отговора
646 прегледа
Search функция в RostgreSQL
Искам да направя Search функция, в която да се конструира заявката в зависимост от това дали някои параметър е NULL или не и накрая тази заявка да се изпълни.
Ако не се прави така то по какъв друг начин да го направя?
Ако не се прави така то по какъв друг начин да го направя?
Re: Search функция в RostgreSQL
Нещо не мога да схвана какво точно искаш да направиш. Можеш ли да дадеш примерно извикване на тази фукнция и примерната заявка, която да връща?
Everything louder than everything else...
Everything louder than everything else...
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;
Разбира се тази функция не е синтактично вярна, но така само описвам как си я представям!
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;
Разбира се тази функция не е синтактично вярна, но така само описвам как си я представям!
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;
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;
Re: Search функция в RostgreSQL
То горе-долу си е обяснено в документацията доста добре, но ето:
Надявам се, че не си имал предвид RostgreSQL, а PostgreSQL все пак?
Everything louder than everything else...
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 на
Re: Search функция в RostgreSQL
syntax error at or near "DEFINE" at character 96
Излезе такава грешка, и аз нещо не мога да се ориентирам.
Излезе такава грешка, и аз нещо не мога да се ориентирам.
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
ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "sp_company_search1" line 15 at return next
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
ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "sp_company_search2" line 12 at return next
Re: Search функция в RostgreSQL
извинявай DECLARE е
писах я без да я тествам понеже не бях сигурен дали това искаш
виж си типа на company_with_address_data и коригирай select-а
предполагам тази грешка е заради несъвместими типове
писах я без да я тествам понеже не бях сигурен дали това искаш
виж си типа на company_with_address_data и коригирай select-а
предполагам тази грешка е заради несъвместими типове
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;
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;
Re: Search функция в RostgreSQL
Ти нали я извикваш като SELECT * FROM sp_company_search(null, null); ?
Everything louder than everything else...
Everything louder than everything else...