在 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,这将无济于事。