2016-09-26 5 views
0

文字列の代わりに十進数の検索をあいまいにしたいと思います。したがって、100の検索では、データベースの行から100,90,95,105,108,120の数値を取得する必要があります。二重ポストグルでのファジー検索

私もキーワードのようにしようとしましたが、私が望むようにはうまくいきません。小数点以下の曖昧検索をどうすればいいですか?ありがとうございます

+1

ファジーマッチングを100と90の間でどう考えますか?なぜ下限と上限を指定しないのですか? –

答えて

1

betweenを使用してください。 5%の偏差値100を一致させるため

create or replace function fuzzy_match_numeric 
    (number numeric, value numeric, deviation numeric) 
returns boolean language sql as $$ 
    select number between value- value* deviation and value+ value* deviation 
$$; 

チェック:

select 
    fuzzy_match_numeric(94, 100, .05) r1, 
    fuzzy_match_numeric(95, 100, .05) r2, 
    fuzzy_match_numeric(105, 100, .05) r3, 
    fuzzy_match_numeric(106, 100, .05) r4 

r1 | r2 | r3 | r4 
----+----+----+---- 
f | t | t | f 
(1 row)  
1

は、私はあなたのルックアップ値のセットのための偏差を計算し、最適な候補を選択することをお勧め機能は一例です。以下は整数に基づくサンプルですが、数値型も同様に動作します。

サンプルデータセット:

postgres=# select * from search_table order by 1; 
value 
------- 
    90 
    95 
    100 
    101 
    103 
    105 
    108 
    120 

search_tableのサンプルルックアップ値が設定:SEARCH_CONDITION

postgres=# select * from search_condition order by 1; 
value 
------- 
    100 
    103 
    105 

最良の候補者を探します。

select 
    distinct on (value) 
    value, 
    lookup_value as best_candidate 
from ( 
    select 
    st.value, 
    sc.value as lookup_value, 
    abs(1 - st.value*1.0/sc.value) as deviation 
    from search_table st 
    cross join search_condition sc 
) t 
order by value, deviation, best_candidate; 

結果:

value | best_candidate 
-------+---------------- 
    90 |   100 
    95 |   100 
    100 |   100 
    101 |   100 
    103 |   103 
    105 |   105 
    108 |   105 
    120 |   105 

より低い候補が選択されます。これは、句内のカラムにDESCを追加して、最も高い候補を取ることによって修正することができます。

関連する問題