更快的搜索查询与动态在oracle db上的列

时间:2016-12-04 20:53:51

标签: java oracle jaro-winkler

我有一个表(ResponseData),其列为RESPONSE_ID,RESPONSEDATA,KEY1,KEY2,KEY3,KEY4,VALUE1,VALUE2,VALUE3,VALUE4 用户可以插入以下任何类别的数据。

  • 1,“my response one”,“name”,null,null,null,“Apple”,null,null,null
  • 2,“my response two”,“name”,“age”,null,null,“Apple”,“22”,null,null

稍后在用户请求具有name =“Apple”的Responsedata的不同页面中,age =“32”应返回记录1,因为它具有匹配的属性名称 如果名称=“Apple”age =“22”的用户请求应返回记录1和2,因为它与名称和记录2按名称和年龄匹配。

我们如何在这种情况下形成搜索查询。 我尝试使用utl_match.jaro_winkler_similarity,如下所示 utl_match.jaro_winkler_similarity(上限(VALUE1 | VALUE2 | VALUE3 | VALUE4),(USERINPUTREQUEST))通过获取所有现有记录中的最匹配记录。但是它在触发查询时给出延迟响应,表上有更多数字记录。 感谢您的投入。

1 个答案:

答案 0 :(得分:0)

declare
  cursor c(k1 varchar2,
           k2 varchar2,
           k3 varchar2,
           k4 varchar2,
           v1 varchar2,
           v2 varchar2,
           v3 varchar2,
           v4 varchar2)
   is(select *
        from (select ResponseData.*,
                     case
                       when    (k1 = key1 and v1 <> value1)
                            or (k1 = key2 and v1 <> value2)
                            or (k1 = key3 and v1 <> value3)
                            or (k1 = key4 and v1 <> value4)
                            or (k2 = key1 and v2 <> value1)
                            or (k2 = key2 and v2 <> value2)
                            or (k2 = key3 and v2 <> value3)
                            or (k2 = key4 and v2 <> value4)
                            or (k3 = key1 and v3 <> value1)
                            or (k3 = key2 and v3 <> value2)
                            or (k3 = key3 and v3 <> value3)
                            or (k3 = key4 and v3 <> value4)
                            or (k4 = key1 and v4 <> value1)
                            or (k4 = key2 and v4 <> value2)
                            or (k4 = key3 and v4 <> value3)
                            or (k4 = key4 and v4 <> value4)
                       then 'not match'
                       else 'match'
                     end ok
                from ResponseData)
       where ok = 'match'
          or ok = 'not match');  -- debug mode
begin
  for r in c('name', null, null, 'age', 'Apple', null, null, '22') loop
    dbms_output.put_line(r.id||': ('||r.key1||'=>'||r.value1||'), ('||r.key2||'=>'||r.value2||'), ('
                                    ||r.key3||'=>'||r.value3||'), ('||r.key4||'=>'||r.value4||') - '||r.ok);
  end loop;
end;