2016-09-15 84 views
0
CREATE OR REPLACE FUNCTION public.get_locations(
    location_word varchar(50) 
    ) 
RETURNS TABLE 
(
    country varchar(50), 
    city varchar(50) 
) 
AS $$ 
DECLARE 
location_word_ varchar(50); 
BEGIN 
location_word_:=concat(location_word, '%'); 
RETURN QUERY EXECUTE format(' (SELECT c.country, ''::varchar(50) as city FROM webuser.country c 
            WHERE lower(c.country) LIKE %L LIMIT 1) 
           UNION 
           (SELECT c.country,ci.city FROM webuser.country c 
            JOIN webuser.city ci ON c.country_id=ci.country_id 
            WHERE lower(ci.city) LIKE %L LIMIT 4)', 
            location_word_, 
            location_word_) ; 

END 
$$ language PLPGSQL STABLE; 

這是我得到的錯誤;使用Union子句postgresql時出錯9.5

  • 錯誤:在語法錯誤或接近 「%」
  • LINE 2:WHERE較低(c.country)LIKE '百分比' LIMIT 1)

爲什麼我得到這個錯誤?

編輯

當我剛剛更換''::varchar(50)''''::varchar(50)它的工作!

+0

'%L'是應該是什麼''%L'',在引號中的錯字。也可能有其他問題,但這應該可以解決您報告的錯誤。 –

+0

爲什麼使用PL/pgSQL函數?爲什麼動態SQL?這可以通過簡單的SQL函數並且不需要動態SQL來簡化。 http://dpaste.com/1A96R5C –

+0

@a_horse_with_no_name我不知道,我通常使用這種方式...以及如果我不能解決這個問題,我會用你的代碼... – lowdegeneration

回答

1

嘗試下修正功能:

CREATE OR REPLACE FUNCTION public.get_locations(
    location_word varchar(50) 
    ) 
RETURNS TABLE 
(
    country varchar(50), 
    city varchar(50) 
) 
AS $$ 
DECLARE 
location_word_ varchar(50); 
BEGIN 
location_word_:=concat(location_word, '%'); 
RETURN QUERY EXECUTE format(' (SELECT c.country, ''''::varchar(50) as city FROM webuser.country c 
            WHERE c.country ILIKE ''%L'' LIMIT 1) 
           UNION 
           (SELECT c.country,ci.city FROM webuser.country c 
            JOIN webuser.city ci ON c.country_id=ci.country_id 
            WHERE ci.city ILIKE ''%L'' LIMIT 4)', 
            location_word_, 
            location_word_) ; 

END 
$$ language PLPGSQL STABLE; 
+2

佔位符'%L' **將根據需要添加單引號。 Do ** not **將它們包含在格式字符串'''%L''中將在運行時生成額外的單引號。罪魁禍首就是''':: varchar(50)',應該是'''':: varchar(50)',就像你有的一樣。 –

+0

然後嘗試連接查詢字符串和'location_word_',就像這樣:'.. ILIKE'|| location_word_ || 'LIMIT ..'。 –

+0

或者你可以嘗試在下面的字符串中使用雙重'%':'location_word _:= concat(location_word,'%%');'。 [除了上面描述的格式說明符之外,還可以使用特殊序列%%輸出字符%字符](https://www.postgresql.org/docs/9.5/static/functions-string.html#FUNCTIONS-字符串的格式)。 –