0 票
1个观点 嗨, 我有一个场景,我们有一个记录和多个这样的列 Record_number cd1 cd2 cd3 cd4 cd5 cd6 cd7 cd8 cd9
以下是上述记录的值 123 12 null 13 14 null 15 16 17 null 这里我们有cd1的值而不是cd2的值,我们有cd3的值所以cd2是空的所以cd3应该进入cd2,因为它是空的所以我们应该将下一个可用的值移动到以前的可用空间。
有谁知道如何实现这种情况?
答案 0 :(得分:0)
如果我正确理解您的问题,可以使用表达式转换轻松完成。
答案 1 :(得分:0)
首先创建一个可以使用某个分隔符连接所有非空值的变量端口,例如|
,如:
IIF(ISNULL(cd1),'',cd1 || '|') ||
IIF(ISNULL(cd2),'',cd2 || '|') ||
...
IIF(ISNULL(cd9),'',cd9 || '|') ||
这应该导致管道分隔列表中删除了空值,例如:
123|12|13|14|15|16|17|
接下来为每列创建一个输出端口,使用分隔符的索引获取正确的子字符串。我会把这部分内容留给你,但是如果你有问题,请告诉我。
答案 2 :(得分:0)
一种方法可以是使用表达式转换,如下所示:
首先使用分隔符连接单个字段中的所有端口(例如',')
v_CONCAT:= cd1||','||cd2||','||cd3||','||cd4||','||cd5||','||cd6||','||cd7||','||cd8||','||cd9
现在使用正则表达式
创建输出端口o_cd1:=REG_EXTRACT(v_CONCAT,',*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*)',1)
o_cd2:=REG_EXTRACT(v_CONCAT,',*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*)',2)
o_cd3:=REG_EXTRACT(v_CONCAT,',*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*),*([^,]*)',3)
.
.
and so on.
REG_EXTRACT从输入字符串中提取与正则表达式匹配的子字符串。
()
- 一个小组。将有与您的端口cd1-cd12 ,*
- 零个或多个逗号,如果值为null,则两个逗号将连续出现[^,]
- 逗号以外的任何内容[^,]*
- 除逗号以外的任何字符的零或多个REG_EXTRACT的第三个参数表示您想要输出的组。对于o_cd1,我们想要第一个非NULL值,因此它是1,对于o_cd2,它是2,依此类推