文字列の代わりに十進数の検索をあいまいにしたいと思います。したがって、100の検索では、データベースの行から100,90,95,105,108,120の数値を取得する必要があります。二重ポストグルでのファジー検索
私もキーワードのようにしようとしましたが、私が望むようにはうまくいきません。小数点以下の曖昧検索をどうすればいいですか?ありがとうございます
文字列の代わりに十進数の検索をあいまいにしたいと思います。したがって、100の検索では、データベースの行から100,90,95,105,108,120の数値を取得する必要があります。二重ポストグルでのファジー検索
私もキーワードのようにしようとしましたが、私が望むようにはうまくいきません。小数点以下の曖昧検索をどうすればいいですか?ありがとうございます
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)
は、私はあなたのルックアップ値のセットのための偏差を計算し、最適な候補を選択することをお勧め機能は一例です。以下は整数に基づくサンプルですが、数値型も同様に動作します。
サンプルデータセット:
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
を追加して、最も高い候補を取ることによって修正することができます。
ファジーマッチングを100と90の間でどう考えますか?なぜ下限と上限を指定しないのですか? –