我有一个选择查询,它获取一个包含复杂数据的字段。我需要以指定格式解析该数据。请帮助您的专业知识:
selected string = complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I
expected output - PB|I
请帮我写一个 sql 正则表达式来完成这个输出。
我有一个选择查询,它获取一个包含复杂数据的字段。我需要以指定格式解析该数据。请帮助您的专业知识:
selected string = complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I
expected output - PB|I
请帮我写一个 sql 正则表达式来完成这个输出。
弄清楚正则表达式的第一步是能够用简单的语言来描述它。根据我们从您的帖子中了解到的信息(正如其他人所说,确实需要更多信息),必须做出一些假设。
我会通过这样描述它来尝试一下,这是基于您提供的示例数据:我想要一个或多个字符的集合,它们跟在等号后面,但不包括以下空格或行尾。输出应该是这些字符集,由管道分隔,按照从左到右读取时在字符串中遇到的顺序排列。我的假设基于您的测试数据:字符串中仅存在 2 个等号,最后一个数据元素后面不是空格,而是在行尾。可以使用该信息构建正则表达式,但您还需要考虑会更改正则表达式的其他事实。
所有这些都会影响正则表达式的设计方式。综上所述,根据提供的数据和所述的假设,接下来我将构建一个描述字符串的正则表达式(真正从普通语言转换为正则表达式语言),围绕我们想要保留的数据集进行分组,然后用管道分隔的那些数据集替换字符串。
SQL> with tbl(str) as (
2 select 'complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I' from dual
3 )
4 select regexp_replace(str, '^.*=([^ ]+).*=([^ ]+)$', '\1|\2') result from tbl;
RESU
----
PB|I
匹配正则表达式解释:
^ Match the beginning of the line
. followed by any character
* followed by 0 or more 'any characters' (refers to the previous character class)
= followed by an equal sign
( start remembered group 1
[^ ]+ which is a set of one or more characters that are not a space
) end remembered group one
.*= followed by any number of any characters but ending in an equal sign
([^ ]+) followed by the second remembered group of non-space characters
$ followed by the end of the line
替换字符串解释:
\1 The first remembered group
| a pipe character
\2 the second remember group
请记住,此答案适用于所示的确切示例数据,并且可能不适用于所有情况。您需要分析您将使用的数据。无论如何,这些步骤应该让您在遇到具有挑战性的正则表达式时开始解决问题。重要的是要考虑可能存在的所有类型的数据和模式(或 NULL),并允许正则表达式中的所有情况,以便返回准确的数据。
编辑:检查一下,它会在等号之后解析所有值并允许空值:
SQL> with tbl(str) as (
2 select 'a=zz|complexType|ChannelCode=PB - Phone In A Box|IncludeExcludeIndicator=I - testing|test1=|test2=test2 - testing' from dual
3 )
4 select regexp_substr(str, '=([^ |]*)( |||$)', 1, level, null, 1) output, level
5 from tbl
6 connect by level <= regexp_count(str, '=')
7 ORDER BY level;
OUTPUT LEVEL
-------------------- ----------
zz 1
PB 2
I 3
4
test2 5
SQL>