假设我有一个由 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
但是这种方法并没有起作用,因为它检索无序的旋转列。
你知道如何以有序的方式检索预期的数据吗?
如果将分割交换为:
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
,我只是将其包含在内,以便您可以看到可用的内容。