【发布时间】:2018-04-17 14:57:47
【问题描述】:
我正在尝试创建一个使文本列同质化的函数。它是一系列 regex_replaces 在 case when 函数中。
我相信以下(缩短的)代码应该给我解决方案:
CREATE OR REPLACE FUNCTION clean_data(address_token text) RETURNS
setof text
AS
$$
BEGIN
return case when address_token like '%allee' OR address_token LIKE '%ally' OR address_token LIKE '%aly' then regexp_replace(address_token,'(allee|ally|aly)$', 'alley')
when address_token like '%annex' OR address_token LIKE '%annx' OR address_token LIKE '%anx' then regexp_replace(address_token,'(annex$|annx$|anx$)', 'anex')
when address_token like '%arc' then regexp_replace(address_token ,'arc$', 'arcade')
.
.
.
when address_token like '%wls' then regexp_replace(address_token ,'wls$', 'wells') else address_token;
END;
$$ LANGUAGE plpgsql;
CREATE TABLE newtable AS
select postcode, (clean_data(address1)) as address1 (clean_data(address2)) as address2, (clean_data(address3)) as address3
from oldtable where postcode SIMILAR TO '(a|b)%';
但是,当我运行它时,我收到错误消息:
RETURN cannot have a parameter in function returning set
LINE 5: return case when address_token like '%allee' OR address_to...
^
HINT: Use RETURN NEXT or RETURN QUERY.
当我接受它的建议并改用“返回查询”时,我被告知:
syntax error at or near "case"
LINE 5: return query case when address_token like '%allee' OR addr...
我觉得这不是很有帮助。
这个函数的正确写法是什么?
我对 SQL 函数比较陌生,并且不能 100% 确定:
- 'returns setof text':这会按预期返回一个字段吗?
- 语言:这是 SQL 还是 plpgsql
- 'RETURN' vs 'RETURN NEXT' vs 'RETURN QUERY':我不确定这里的区别
过去几个小时我一直在谷歌上搜索,进展甚微,了解也很少,因此我们将不胜感激
【问题讨论】:
标签: postgresql plpgsql