如何在PostgreSQL函数中连接两个字符串?

时间:2019-08-26 12:26:33

标签: postgresql plpgsql concat

我想要一个将返回简明字符串的函数。在postgresql中执行此功能后,出现以下错误。

CREATE OR REPLACE FUNCTION getTableName () 
RETURNS text AS $$ 
DECLARE 
    state_short_name text; 
BEGIN 
   state_short_name := (select lower(state_short_name) from mst_state where state_code in (SELECT substr(entity_code,1,2) FROM shg_detail_share WHERE entity_code = '3420006002001'))   
   RETURN (CONCAT(state_short_name, '_shg_detail'));
END;
$$  LANGUAGE plpgsql 

我希望输出像'jh_shg_detail',但是却出现这样的错误

ERROR:  syntax error at or near "("
LINE 9:    RETURN (CONCAT(state_short_name, '_shg_detail')); 

2 个答案:

答案 0 :(得分:3)

您应该在PL / pgSQL中使用select into。为避免名称冲突,请不要将变量的名称与列相同:

CREATE OR REPLACE FUNCTION gettablename() 
RETURNS text AS $$ 
DECLARE 
    l_state_short_name text; 
BEGIN 
   select lower(state_short_name) 
      into l_state_short_name 
   from mst_state 
   where state_code in (SELECT substr(entity_code,1,2) 
                        FROM shg_detail_share 
                        WHERE entity_code = '3420006002001'));   
   RETURN CONCAT(state_short_name, '_shg_detail');
END;
$$  LANGUAGE plpgsql;

但是对于这样的简单SQL查询,不需要PL / pgSQL。您的子查询也不是必需的。您可以将其简化为where state_code = '34'

CREATE OR REPLACE FUNCTION gettablename() 
RETURNS text 
AS $$ 
   select concat(lower(state_short_name), '_shg_detail') 
   from mst_state 
   where state_code = '34';
$$  
LANGUAGE sql;

答案 1 :(得分:2)

您的问题是赋值语句:=所在的行缺少分号。

这使以RETURN (CONCAT开头的行成为语句的延续行,因此您会在该行中报告语法错误。