2017-03-02 72 views
1

我在PostgreSQL数据库中有一个表格,其中有四列包含越来越详细的信息(思考状态 - >城市 - >街道 - >数字),以及一列中根据一些简单格式化规则。示例:列式自动完成

| 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

您可以将输入分割为多个字段。例如,你输入kommun的东西,你可以在那里自动完成,等等。 –

+0

@BenH好主意。不幸的是,客户端中只有一个输入字段,这是我的手中。 – aznan

回答

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$; 
+0

如果我读了这个权利,那么我仍然需要事先知道有多少列正在播放。从'mora gis'我不知道NUMPARTS应该是1还是2.我可以运行另一个查询来确定它吗? – aznan

+0

(编辑后)NUMPARTS仍然只是一个字数。它将用于'mora gis',但它不适用于'lilla ed'。在这种情况下,我会期待'[“Lilla Edet”]的结果 – aznan