2016-03-17 3 views
0

Итак, я создал 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); 

но просто не может найти способ, чтобы получить, что работать :(

+0

Что вы думаете? Можно ли хранить таблицу в переменной? [Может быть] (http://www.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0053478.html?lang=en). Тебе следует? Возможно, нет. – mustaccio

+0

обычно то, что у меня просто не так, потому что мне нужно создать временную таблицу дважды и интересно, есть ли лучший способ сделать это. – Wizuriel

+0

Рассмотрим внешнее соединение вместо 'intersect' – mustaccio

ответ

1

Это, вероятно, будет проще просто создать таблицу инлайн, что есть, с КТР:

WITH T1 AS (SELECT word 
      FROM TABLE(tokenize(STRING1, ' '))) 
SELECT COUNT(*)/(SELECT COUNT(*) FROM T1) AS score 
FROM (SELECT word 
     FROM T1 
     INTERSECT ALL 
     SELECT word 
     FROM TABLE(tokenize(STRING2, ' ')) 
) 

... если вы заметите, это также позволило мне рассчитать счет в том же заявлении

.

Это не поможет, если вы действительно работаете со столами вне этого единственного оператора.

+0

Это работает. Для любой дополнительной работы я могу просто создать функцию, которая работает со значениями, вытащенными из таблицы. – Wizuriel

Смежные вопросы