Ускоренный поисковый запрос с динамическими столбцами где dracle

У меня есть таблица (ResponseData) со столбцами RESPONSE_ID,RESPONSEDATA,KEY1,KEY2,KEY3,KEY4,VALUE1,VALUE2,VALUE3,VALUE4 пользователь может вставить данные любой из нижеуказанной категории.

  • 1, "мой ответ один", "имя", ноль, ноль, ноль, "Apple", ноль, ноль, ноль
  • 2, "мой ответ два", "имя", "возраст", ноль, ноль, "яблоко", "22", ноль, ноль

Позже на другой странице, когда пользовательский запрос на Responsedata с именем ="Apple",age="32" должен вернуть запись 1, потому что он имеет совпадающее имя свойства, если пользовательский запрос с именем ="Apple" age="22" должен вернуть запись 1 и 2, потому что это соответствует записи 1 по имени и записи 2 по имени и возрасту.

Как мы можем сформировать поисковый запрос в этом сценарии. Я попытался с utl_match.jaro_winkler_simility, как показано ниже: utl_match.jaro_winkler_sdentifity(upper(VALUE1|VALUE2|VALUE3|VALUE4),(USERINPUTREQUEST)), извлекая лучшие совпадающие записи во всех существующих records.but, но дает более отложенный ответ при запуске Количество записей на столе. Ценится за ваши вклады.

1 ответ

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;
Другие вопросы по тегам