【问题标题】:Teradata REGEXP_SPLIT_TO_TABLE Input ParameterTeradata REGEXP_SPLIT_TO_TABLE 输入参数
【发布时间】:2016-09-27 02:11:24
【问题描述】:

我希望能够在 CTE 中定义一个输入参数,然后在 REGEXP_SPLIT_TO_TABLE 函数中使用它,如下所示:

WITH PARAMS (INPUT_PARAMS) AS
(SELECT
    '?InputParams' AS INPUT_PARAMS
)
SELECT
    TEST_TABLE.SPLIT_PARAMS
FROM
    TABLE (REGEXP_SPLIT_TO_TABLE(1, PARAMS.INPUT_PARAMS, '\|', 'i')
        RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE
    CROSS JOIN PARAMS

但是这会产生以下错误:

选择失败。 [3706] 语法错误:不支持连接表 与表运算符或表函数结合使用 可变输入参数。

将参数正确地放入函数中,如下所示:

SELECT
    TEST_TABLE.SPLIT_PARAMS
FROM
    TABLE (REGEXP_SPLIT_TO_TABLE(1, '?InputParams', '\|', 'i') --
        RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE

但我想知道是否有办法做更像上面第一个例子的事情。

【问题讨论】:

    标签: function teradata


    【解决方案1】:

    此函数不允许使用 JOIN 语法,但您可以进行旧式连接:

    WITH PARAMS (INPUT_PARAMS) AS
    (SELECT
        '?InputParams' AS INPUT_PARAMS
    )
    SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE (REGEXP_SPLIT_TO_TABLE(1, PARAMS.INPUT_PARAMS, '\|', 'i')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE
        ,PARAMS
    

    事实上你根本不需要加入:

    WITH PARAMS (INPUT_PARAMS) AS
    (SELECT
        '?InputParams' AS INPUT_PARAMS
    )
    SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE (REGEXP_SPLIT_TO_TABLE(1, PARAMS.INPUT_PARAMS, '\|', 'i')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE
    

    由于您不使用正则表达式,您还可以切换到STRTOK_SPLIT_TO_TABLE:

    WITH PARAMS (INPUT_PARAMS) AS
    (SELECT
        '?InputParams' AS INPUT_PARAMS
    )
    SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE (StrTok_Split_To_Table(1, PARAMS.INPUT_PARAMS, '\|')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET Unicode)) AS TEST_TABLE
    

    【讨论】:

    • 答案 #3 很棒。我认为我应该切换到 STROK,但这意味着尝试使用 TD 文档,所以我在一段时间后放弃了 :)。最有帮助和意想不到的部分是“事实上你根本不需要加入”。这意味着我可以将未连接的拆分放在我的 CTE 中,然后将 WITH 连接到我真实代码中的其他表中。一个问题:为什么不需要加入?似乎因为我指的是 TABLE 函数中的 PARAMS 需要加入它。不是我在抱怨……再次感谢!
    • @DougGlancy:不要问我为什么语法是这样的(文档真的很糟糕)。这是一种关联连接,类似于标准 SQL 的 Lateral Join。
    • 好吧,我很高兴它可以工作,而且我们有你补充文档。再次感谢迪特。
    猜你喜欢
    • 2015-03-07
    • 2020-12-27
    • 2016-08-01
    • 1970-01-01
    • 2016-05-28
    • 2021-12-22
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多