【问题标题】:Teradata SQL Split Single String into Table RowsTeradata SQL 将单个字符串拆分为表行
【发布时间】:2021-07-19 13:13:54
【问题描述】:

我有一个字符串元素,例如:

"(1111, Tem1), (0000, Tem2)"
并希望生成数据表如
var1 var2
1111 Tem1
0000 Tem2

这是我的代码,我创建了滞后 token 并使用奇数行元素进行过滤。


with var_ as (
    select '(1111, Tem1), (0000, Tem2)' as pattern_
)
select tbb1.*, tbb2.result_string as result_string_previous
from(
    select tb1.*,
        min(token) over(partition by 1 order by token asc rows between 1 preceding and 1 preceding) as min_token
    from
        table (
            strtok_split_to_table(1, var_.pattern_, '(), ')
            returns (outkey INTEGER, token INTEGER, result_string varchar(20))
        ) as tb1) tbb1

inner join (select min_token, result_string from tbb1) tbb2
    on tbb1.token = tbb2.min_token

where (token mod 2) = 0;

但似乎我无法在“from”步骤中生成新变量并直接在“join”步骤中应用它。 所以我想问在我的程序中是否仍然可以得到我想要的结果?或者有什么建议吗?

感谢您的所有帮助。

【问题讨论】:

    标签: teradata-sql-assistant


    【解决方案1】:

    我不会拆分/重组这些组。将每个组拆分为一行,然后拆分行内的值,例如

    with var_ as (
        select '(1111, Tem1), (0000, Tem2)' as pattern_
    ),
    split1 as (
        select trim(leading '(' from result_string) as string_  
        from
            table ( /* split at & remove right parenthesis */
                regexp_split_to_table(1, var_.pattern_, '\)((, )|$)','c')
                returns (outkey INTEGER, token_nbr INTEGER, result_string varchar(256))
            ) as tb1
    )
    select *
        from table(
                csvld(split1.string_, ',', '"')
                returns (var1 VARCHAR(16), var2 VARCHAR(16))
            ) as tb2
    ;
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2014-12-12
      • 2016-04-18
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多