使用 DB2 用户定义函数中的表
Posted
技术标签:
【中文标题】使用 DB2 用户定义函数中的表【英文标题】:Working with a table in a DB2 User Defined Function 【发布时间】: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)
?
【参考方案1】:
内联创建表格可能是最简单的;也就是说,使用 CTE:
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, ' '))
)
...如果你注意到的话,这也让我可以在同一个语句中计算分数。
如果您实际上要使用此单个语句之外的表,这将无济于事。
【讨论】:
那行得通。对于任何额外的工作,我可以创建一个函数来处理从表中提取的值。以上是关于使用 DB2 用户定义函数中的表的主要内容,如果未能解决你的问题,请参考以下文章