使用DB2用户定义函数中的表

时间:2016-03-17 23:51:08

标签: sql db2 user-defined-functions

所以我在DB2中创建了一个UDF,它标记了一个名为Tokenize的String,并返回一个带有ID和word的表(所以每行都是一个在初始字符串中的单词)。例子

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的长度而不得不重新调用tokenize代码,但这只会让我觉得错误。在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 );

但是找不到办法让它发挥作用:(

1 个答案:

答案 0 :(得分: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, ' '))
)

......如果您注意到,这也允许我在同一声明中计算得分。

如果你真的在这个单一陈述之外使用表格,这将不会有帮助。