我有两个表在oracle sql与字段在每个我需要匹配和显示,如果它不匹配。单独表中的两个字段有各种格式,这并不理想,但情况就是如此。范例:
表1:
| ID|示例_字符串|示例_正则表达式_匹配|
| --|--|--|
| 1 |(0888DY:A001:B2:C3)|A1b2c3|
| 2 |(0888DY:A001:B3)|A1b3|
表2:
| ID|示例_字符串|示例_正则表达式_匹配|
| --|--|--|
| 1 |0888DY,A1:B2:C3| A1b2c3|
| 2 |0888DY,A1:B2| A1b2|
在上面的例子中,我希望ID 1在表之间匹配并被忽略,而ID 2被选择,因为它彼此不匹配。匹配的确定只是A后跟一个非零值,B后跟任何非零值,C后跟任何非零值,等等,所以在ID 1的情况下:A1 B2 C3.所有其他的东西,比如前缀0888 DY,逗号,括号,前导零,理想情况下都可以忽略。我假设我需要使用正则表达式来实现这一点,所以这里是我的开始:
SELECT a.ID, a.EXAMPLE_STRING, b.EXAMPLE_STRING
FROM Table1 a
INNER JOIN Table2 b
ON a.ID = b.ID
WHERE REGEX_REPLACE(a.EXAMPLE_STRING, regexhere) != REGEX_REPLACE(b.EXAMPLE_STRING, regexhere)
3条答案
按热度按时间vktxenjb1#
REGEXP_INSTR()
对于判断两个字符串是否匹配相同的模式没有用处。它只是返回找到模式匹配的位置(就像INSTR()
处理普通字符串一样)。为了将
A001
转换为A1
,您需要将REGEXP_REPLACE()
沿着一个捕获组,以便可以删除前导零。在比较之前,您还需要删除第一个
:
或,
之前的所有内容。kcwpcxri2#
首先你提到的匹配模式我不知道为什么我不能理解它。你描述的方式,
匹配的确定只是A后跟一个非零值,B后跟任何非零值,C后跟任何非零值
这也不应该匹配表1的第1行,因为A后面跟着一些零,但在表2中不是这种情况。
如果这个答案对你没有帮助我需要更多的解释。
正如你提到的:
单独表中的两个字段有各种格式,这并不理想
一个想法是 * 尝试规范化这两个字段 *,以便那些不匹配的字段。看看这个:
您应该非常小心地选择用于规范化的RegEx,以避免意外。
正如我所说的,我真的不能理解你的问题的那一部分,所以我的RegEx可能不会是一个确切的解决你的问题
祝你好运!
qnzebej03#
根据所提供的数据以及您在M. Pour的回答(“* 本质上,我希望规范化/匹配只在字母A-C(不管前导零和前缀)和它之后但在下一个字母 * 之前的非零数字上”)一个选项可以根本不使用regexp。
创建CTE,它将转换您的示例数据以使其模式化:
**注意:**以上代码删除了不需要进一步处理的字符,如圆括号和逗号,并切断了第一个元素。请注意,这适用于提供的示例数据,如果在您的真实的数据中还有其他一些此类字符,您可能也需要处理它们。
应该使用另一个CTE对生成的数据集进行进一步调整,然后您就可以获得预期的结果
如果这可以调整以处理您的实际数据-它应该比regexp快得多。