如何根据每个id的出现顺序将字符串字符分成行?

问题描述 投票:0回答:1

假设我有一个由 id 列和由一组字符表示的字符串组成的表:

with fake_data(id, ex_character) as (
    select * from values
        ('A', 'T70891'),
        ('B', 'RT9811111')
)

我想将字符串字符拆分为每个不同 id 值的行,因此预期输出应如下所示:

# id   value

# A     T
# A     7
# A     0
# A     8
# A     9
# A     1
# B     R
# B     T
# B     9
# B     8
# B     1
# B     1
# B     1
# B     1
# B     1

到目前为止,我已经尝试过类似的方法:

select fd.id, f.value 

from fake_data fd, 
lateral split_to_table(regexp_replace(trim(fd.ex_character), '.', './/0', 2), ',') f

但是这种方法并没有起作用,因为它检索无序的旋转列。

你知道如何以有序的方式检索预期的数据吗?

sql string split snowflake-cloud-data-platform character
1个回答
0
投票

如果将分割交换为:

lateral split_to_table(regexp_replace(trim(fd.ex_character), '.', '.\\0', 2), '.') f

它会正确发生。订购您想要使用的东西

f.index

因此:

with fake_data(id, ex_character) as (
    select * from values
        ('A', 'T70891'),
        ('B', 'RT9811111')
)
select 
    fd.id
    ,f.value
    ,f.index
from fake_data as fd,
lateral split_to_table(regexp_replace(trim(fd.ex_character), '.', '.\\0', 2), '.') f
order by fd.id, f.index

给出:

身份证 价值 索引
A T 1
A 7 2
A 0 3
A 8 4
A 9 5
A 1 6
B R 1
B T 2
B 9 3
B 8 4
B 1 5
B 1 6
B 1 7
B 1 8
B 1 9

因此不需要选择

f.index
,我只是将其包含在内,以便您可以看到可用的内容。

© www.soinside.com 2019 - 2024. All rights reserved.