2016-09-26 297 views
0

我想能够在CTE定义的输入参数,然后REGEXP_SPLIT_TO_TABLE函数内使用,像这样:Teradata的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 

然而,这产生以下错误:

SELECT Failed. [3706] Syntax error: Joined table is not supported in conjuction with table operators or table function invoked with variable input argument.

把参数就在功能的工作原理,如下图所示:

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 

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

回答

2

此功能不允许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 
+0

答案#3很好。我以为我应该改用STROK,但这意味着试图使用TD文档,所以我放弃了一段时间后:)。最有用的和意想不到的部分是“实际上你根本不需要加入。”这意味着我可以将未加入的分割放入我的CTE中,然后在我的真实代码中将WITH加入其他表中。一个问题:为什么不需要连接?这似乎是因为我指的是需要加入到TABLE函数中的PARAMS。不是我在抱怨...再次感谢! –

+0

@DougGlancy:不要问我为什么语法是这样的(文档非常糟糕)。这是一种相关联接,与标准SQL的*横向联接*类似。 – dnoeth

+0

嗯,我只是很高兴它的工作原理,我们有你补充文件。再次感谢Dieter。 –