Итак, я создал UDF в DB2, который токенизирует строку, называемую Tokenize, и возвращает таблицу с идентификатором и словом (поэтому каждая строка - это слово, которое было в исходной строке). ПримерРабота с таблицей в пользовательской функции DB2
tokenize('University of Toronto', ' ') returns
ID Word
1 University
2 of
3 Toronto
То, что я пытаюсь сделать, это еще одна функция, которая сравнивает 2 строки, чтобы увидеть, сколько слов они имеют в общем на основе длины первой строки.
Так, например, «Университет Торонто» и «Университет гвельфов» должен вернуть 0,66 я получил эту работу с этим кодом
CREATE OR REPLACE FUNCTION Parsed_Match(STRING1 VARCHAR(256), STRING2 VARCHAR(256))
RETURNS DECIMAL(5,2)
NO EXTERNAL ACTION
BEGIN
DECLARE SCORE DECIMAL(5,2);
DECLARE mymatches int;
DECLARE len int;
set mymatches = (
select count(*)
from (
select word
from table(tokenize(STRING1, ' '))
intersect all
select word
from table(tokenize(STRING2, ' '))
)
);
set len = (
select count(*)
from table(tokenize(STRING1, ' '))
);
set score = decimal(mymatches)/decimal(len);
RETURN SCORE;
END
Имея вспомнить код разметить, хотя, чтобы получить длину string1 просто поражает меня как неправильное. Есть ли способ в DB2 Я могу сохранить вычисленную таблицу в переменной для повторного использования этого позже?
как я в идеале хочу сделать
set t1 = tokenize(String1);
set t2 = tokenize(String2);
set matches = (
select count(*)
from (
select word
from t1
intersect all
select word
from t2
)
);
set len = (select count(*) from t1);
но просто не может найти способ, чтобы получить, что работать :(
Что вы думаете? Можно ли хранить таблицу в переменной? [Может быть] (http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0053478.html?lang=en). Тебе следует? Возможно, нет. – mustaccio
обычно то, что у меня просто не так, потому что мне нужно создать временную таблицу дважды и интересно, есть ли лучший способ сделать это. – Wizuriel
Рассмотрим внешнее соединение вместо 'intersect' – mustaccio