Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 双词根的模糊搜索_Sql_Postgresql_Fuzzy Search - Fatal编程技术网

Sql 双词根的模糊搜索

Sql 双词根的模糊搜索,sql,postgresql,fuzzy-search,Sql,Postgresql,Fuzzy Search,我想模糊搜索十进制数而不是字符串。所以,搜索100的想法应该是从数据库中的行中得到100、90、95、105、108、120个数值 我也尝试过like关键字,但它没有像我想要的那样工作。如何对小数进行模糊搜索。谢谢在之间使用。该函数是一个示例: create or replace function fuzzy_match_numeric (number numeric, value numeric, deviation numeric) returns boolean language

我想模糊搜索十进制数而不是字符串。所以,搜索100的想法应该是从数据库中的行中得到100、90、95、105、108、120个数值


我也尝试过like关键字,但它没有像我想要的那样工作。如何对小数进行模糊搜索。谢谢

在之间使用
。该函数是一个示例:

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
$$;
检查是否匹配偏差为5%的值100:

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)     

之间使用
。该函数是一个示例:

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
$$;
检查是否匹配偏差为5%的值100:

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
样本查找值集:搜索条件

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
添加到
ORDER by
子句中的
best_candidate
列中来修改,以获取最高的候选者。

我建议计算一组查找值的偏差并选择最佳候选者。下面是一个基于整数的示例,但数字类型也可以类似地工作

样本数据集:搜索表

postgres=# select * from search_table order by 1;
 value
-------
    90
    95
   100
   101
   103
   105
   108
   120
样本查找值集:搜索条件

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

如果出现平局,将选择较低的候选人。这可以通过将<代码> DES> <代码>添加到<<代码> BestRoad < /COD>列中的<<代码>顺序> < /Cult>子句中,以获得最高的候选值。

您认为100和90之间的模糊匹配是正确的吗?你为什么不指定下界和上界呢?你认为100和90之间的模糊匹配是正确的吗?为什么不指定下限和上限?