逐列自动完成

时间:2017-03-02 10:42:23

标签: postgresql autocomplete

我在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"]

由于前两列可以包含任意数量的单词,因此我无法再使用输入来确定要在响应中包含的列数。有没有办法做到这一点,或者我可能认为这个自动完成业务都错了?

1 个答案:

答案 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$;