在 DB2 用户定义函数中使用 table
Working with a table in a DB2 User Defined Function
所以我在 DB2 中制作了一个 UDF,它标记了一个名为 Tokenize 的字符串,returns 一个带有 ID 和单词的 table(所以每一行都是初始字符串中的一个单词).示例
tokenize('University of Toronto', ' ') returns
ID Word
1 University
2 of
3 Toronto
我想做的是制作另一个函数来比较 2 个字符串,根据第一个字符串的长度来查看它们有多少个相同的单词。
所以例如 'University of Toronto' 和 'University of Guelph' 应该 return 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 中有没有一种方法可以将计算出的 table 存储在一个变量中以便稍后重用?
就像我理想中想要做的那样
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 );
但就是找不到让它工作的方法:(
创建 table 内联可能是最简单的;也就是说,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, ' '))
)
...如果您注意到了,这也让我可以在同一语句中计算分数。
如果您实际上要在这条语句之外使用 table,这将无济于事。
所以我在 DB2 中制作了一个 UDF,它标记了一个名为 Tokenize 的字符串,returns 一个带有 ID 和单词的 table(所以每一行都是初始字符串中的一个单词).示例
tokenize('University of Toronto', ' ') returns
ID Word
1 University
2 of
3 Toronto
我想做的是制作另一个函数来比较 2 个字符串,根据第一个字符串的长度来查看它们有多少个相同的单词。
所以例如 'University of Toronto' 和 'University of Guelph' 应该 return 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 中有没有一种方法可以将计算出的 table 存储在一个变量中以便稍后重用?
就像我理想中想要做的那样
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 );
但就是找不到让它工作的方法:(
创建 table 内联可能是最简单的;也就是说,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, ' '))
)
...如果您注意到了,这也让我可以在同一语句中计算分数。
如果您实际上要在这条语句之外使用 table,这将无济于事。