【发布时间】:2016-03-17 23:51:07
【问题描述】:
所以我在 DB2 中创建了一个 UDF,它对称为 Tokenize 的字符串进行标记,并返回一个带有 ID 和单词的表(因此每一行都是初始字符串中的单词)。例子
tokenize('University of Toronto', ' ') returns
ID Word
1 University
2 of
3 Toronto
我要做的是创建另一个函数来比较 2 个字符串,以根据第一个字符串的长度查看它们有多少共同的单词。
例如,'University of Toronto' 和 'University of Guelph' 应该返回 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 );
但就是找不到让它工作的方法:(
【问题讨论】:
-
你有什么问题?您可以将表存储在变量中吗? May be。你应该?可能不是。
-
通常我只是觉得不对劲,因为我需要创建两次临时表并想知道是否有更好的方法来做到这一点
-
考虑外部联接而不是
intersect -
...你的返回变量是
DECIMAL(5, 2),尽管逻辑上你不能超过1。你应该使用DECIMAL(3, 2)还是DECIMAL(5, 4)?
标签: sql db2 user-defined-functions