使用 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 用户定义函数中的表的主要内容,如果未能解决你的问题,请参考以下文章

15-查看表信息

使用用户定义函数作为表的 DB2 查询结构

DB2 Java 用户定义函数

DB2 LUW:在Dynamic SQL中创建用户定义的函数

如何在 DB2 Z/OS 8.1 版本中创建用户定义函数?

DB2 UDF 异常处理