我在PostgreSQL数据库中有一个表,其中四列包含越来越详细的信息(想想state-> city-> street->数字),以及根据一些简单格式连接所有内容的列规则。例如:
| kommun | trakt | block | enhet | beteckning |
| Mora | Gislövs Läge | 9 | 16 | Mora Gislövs Läge 9:16 |
| Mora | Gisslaved | * | 8 | Mora Gisslaved 8 |
| Mora | Gisslaved | * | 9 | Mora Gisslaved 9 |
| Lilla Edet | Sanda | GA | 1 | Lilla Edet Sanda GA:1 |
Web服务使用此表来实现逐字自动完成,用户在向下钻取时获取输入建议。输入mora gis
将导致
["Mora Gislövs", "Mora Gisslaved"]
目前,这是通过在此查询中逐字拆分连续列来完成的:
select distinct trim(substring(beteckning from '(^(\S+\s?){NUMPARTS})')) as bet
from beteckning_ac
where upper(beteckning) like upper('mora gis%')
order by bet
其中NUMPARTS
是输入中的单词数 - 在这种情况下为2。
现在我希望自动完成按列完成而不是逐字逐句,因此mora gis
现在会导致这样做:
["Mora Gislövs Läge", "Mora Gisslaved"]
由于前两列可以包含任意数量的单词,因此我无法再使用输入来确定要在响应中包含的列数。有没有办法做到这一点,或者我可能认为这个自动完成业务都错了?
答案 0 :(得分:0)
CREATE OR REPLACE FUNCTION get_auto(text)
--$1 is here your input
RETURNS setof text
LANGUAGE plpgsql
AS $function$
declare
NUMPARTS int := array_length(regexp_split_to_array($1,' '), 1);
begin
return query
select
case
when (NUMPARTS = 1) then kommun
when (NUMPARTS = 2) then kommun||' '||trakt
when (NUMPARTS = 3) then kommun||' '||trakt||' '||block
when (NUMPARTS = 4) then kommun||' '||trakt||' '||block||' '||enhet
--alter if you want to
end
from
auto_complete --your tablename here
where
beteckning like $1||'%';
end;
$function$;