大家好,
我有一个与SQL中的正则表达式相关的查询。
我有一种情况,必须从一列中提取一部分字符串。该列的部分将以我的A列为前缀。请参阅屏幕截图以获取示例数据。我还将预期的输出添加到单独的列中(以绿色突出显示)。
场景:
在上面的字符串中,我有多个数字(粗体部分) 而这种情况应该忽略(这意味着它必须给我Null值)。
在此示例中,我要提取的部分是重复的,我希望仅提取突出显示的部分。
其他情况也是如此。
我尝试使用以下sql。面临的挑战是我的Col A也可以出现在Col B中(屏幕快照的第2行),当我使用REGEXP_COUNT函数计数时,此代码正在考虑我的Col A部分,并将其值设置为Null。我的期望是从该列中提取USA12S001部分。
在满足以上两个条件的情况下,您能帮助实现这一目标吗?
SQL :
SELECT
ColA,
ColB,
case when REGEXP_COUNT(ColB,ColA) >2 THEN NULL
ELSE REPLACE(REPLACE(concat(regexp_substr(ColB,ColA||'([[:alnum:]]+\.?)'),
nvl(regexp_substr(ColB,ColA||'(\-[[:digit:]]+)'),
regexp_substr(ColB,ColA||'([[:space:]]\-[[:space:]][[:digit:]]+)'))),
' ',''),'.','')
END AS Result
FROM
table
测试数据:
颜色A
CAN06
USA12
USA27
HUN04
CAN05
USA24
CAN06
Col B
在批准后验证CAN06010025,CAN06010026和CAN06010030
USA12项目:ID USA12S001:需要联系-USA12S001-表格进行更新
USA27项目:ID:USA27S001:产品
要在到期日之后查看ID HUN04S002-HUN04S004。
ID:CAN05S005,详细信息为CAN05S005。
USA24项目:ID:USA24S009:数据发布
“项目:主题CAN06S009:V2和V3-ID CAN06S010:V1”
答案 0 :(得分:1)
如果唯一的问题是REGEXP_COUNT
,那么答案很简单:更改
case when REGEXP_COUNT(ColB,ColA) >2
收件人:
case when REGEXP_COUNT(ColB,ColA || '[[:alnum:]]') >2