2017-03-02 1 views
1

私はPostgreSQLデータベースに、より詳細な情報(state-> city-> street-> numberと考える)を含む4つの列と、すべてがシンプルに連結された列フォーマットルール。例:列方向オートコンプリート

| 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サービスは、彼らがドリルダウンして、ユーザが入力提案を取得する単語ごとのオートコンプリートを実装するためにこの表を使用しています。 - 2で

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は、入力中の単語の数である

mora gisの入力は現在、これはこのクエリ内の単語によって連結された列を分割することによって行われ

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

になりますこの場合。

は今、私はオートコンプリートが列単位ではなく、単語単位で行うことにしたいので、mora gisは今、代わりにこのことになる:

["Mora Gislövs Läge", "Mora Gisslaved"] 

を最初の2つの列が単語の任意の数を含めることができるので、私はもはや入力を使用して、応答に含める列の数を決定することはできません。これを行う方法はありますか、私はおそらくこのオートコンプリートビジネスについて間違っていたでしょうか?

+0

入力を複数のフィールドに分割することができます。たとえば、kommunに何かを入力すると、そこにオートコンプリートするなどのことができます。 –

+0

@BenH良いアイデア。残念ながら、クライアントには1つの入力フィールドしかありません。それは私の手の中にあります。 – 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

関連する問題