2017-03-02 1 views
1

PostgreSQL 데이터베이스에서 점점 더 자세한 정보 (state-> city-> street-> number)가 포함 된 네 개의 열이있는 테이블과 모든 것이 간단한 몇 가지로 연결되는 열이 있습니다 서식 규칙. 예 :열 단위 자동 완성

| 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 | 

웹 서비스들이 드릴 다운 사용자가 입력 제안을 얻는 단어 현명한 자동 완성을 구현하기 위해이 테이블을 사용합니다. mora gis의 입력은

["Mora Gislövs", "Mora Gisslaved"] 

현재,이이 쿼리에서 단어에 의해 연결된 열을 분할하여 수행됩니다 : NUMPARTS 입력 단어의 수입니다

select distinct trim(substring(beteckning from '(^(\S+\s?){NUMPARTS})')) as bet 
from beteckning_ac 
where upper(beteckning) like upper('mora gis%') 
order by bet 

-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 Edet"]' – aznan