首页 > 解决方案 > UDF 返回不同的 SQL 语句

问题描述

我试图根据 IF 条件在 UDF 中返回两个不同的 SQL 语句。到目前为止,我还不能正确地做到这一点,下面的代码不起作用。我怎样才能做到这一点?

CREATE FUNCTION BELSIZE.TEST (aSTRING VARCHAR(50))
    RETURNS TABLE(
    column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )
 ------------------------------------------------------------------------
F1: BEGIN ATOMIC

DECLARE v_string VARCHAR(50);
SET v_string = aSTRING;

IF v_string = '123' THEN 

        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL')
            , (1, 10231012, 'ADDITIONAL')
            , (-1, 10231031, 'REDEEM')
        ) select * from v;

END IF;

RETURN
        With v (column1, column2, column3) as (
            VALUES (1, 10231011, 'PRINCIPAL 456')
            , (1, 10231012, 'ADDITIONAL 456')
            , (-1, 10231031, 'REDEEM 456')
        ) select * from v;


END

谢谢。

标签: sqldb2user-defined-functions

解决方案


由于您需要基于输入字符串的 2 个不同的结果,因此您的返回语句应该在IF-ELSE逻辑上。您处理它的方式在您的查询中是错误的。它总是试图返回返回块中的那个。

我已经更正了符合您要求的查询。使用其中的IF-ELSE逻辑。它写在SQL-SERVER

CREATE FUNCTION dbo.testFn(@aSTRING  VARCHAR(50))  
RETURNS @rtnTable TABLE(
    column1 INTEGER
    , column2 INTEGER   
    , column3 VARCHAR(50)
 )   
AS   
BEGIN  

    IF @aSTRING = '123'
    BEGIN
        INSERT INTO @rtnTable
        VALUES (1, 10231011, 'PRINCIPAL')
            , (1, 10231012, 'ADDITIONAL')
            , (-1, 10231031, 'REDEEM')
    END
    ELSE
    BEGIN 
        INSERT INTO @rtnTable
        VALUES (1, 10231011, 'PRINCIPAL 456')
            , (1, 10231012, 'ADDITIONAL 456')
            , (-1, 10231031, 'REDEEM 456')
    END 

    RETURN
END

推荐阅读