如何在字符正则表达式 SQL 序列中查找相同的两位数



我想打印出在SQL中至少重复两个数字的字符串

EX
11-22-33
11-22-44
22-22-33
55-22-33
11-66-33
11-88-33
33-88-33
77-77-22

输出:

22-22-33
77-77-22
33-88-33

但是我不知道如何编写一个对我有帮助的正则表达式

对于这种固定格式的NN-NN-NN,你可以只使用字符串函数并测试三种可能的组合:

select *
from mytable
where substr(val, 1, 2) = substr(val, 3, 2) 
or substr(val, 1, 2) = substr(val, 5, 2) 
or substr(val, 3, 2) = substr(val, 5, 2) 

我们可以有点花哨,使用横向连接而不是重复的or条件。如果您有 3 个以上的部分,则扩展效果更好(组合数量迅速增加,这使得or解决方案不太方便):

select t.*
from mytable t
cross apply (
select count(distinct part) cnt_distinct_part
from (
select substr(t.val, 1, 2) part
union all select substr(t.val, 3, 2)
union all select substr(t.val, 5, 2)
) x
) x
where x.cnt_distinct_part < 3

您可以使用正则表达式(^|-)(d+)(-d+)*-2(-|$)来匹配任意位数或项数的数字对。

  • (^|-)匹配第一个捕获组中包含的字符串开头^或连字符-();
  • 后跟一个或多个数字字符d+包含在第二个捕获组中,()以匹配数字对中的第一个;
  • 然后()第三个捕获组,该组匹配零次或多次,*包含一个-后跟一个或多个数字,d+以匹配匹配数字对之间的任意数量的数字;
  • 然后连字符-;
  • 然后是第二个捕获组的副本2它将匹配该对数字中的第二个;
  • 然后是连字符-或字符串结尾$

给出查询:

SELECT value
FROM   table_name
WHERE  REGEXP_LIKE( value, '(^|-)(d+)(-d+)?-2(-|$)' );

其中,对于示例数据:

CREATE TABLE table_name ( value ) AS
SELECT '11-22-33' FROM DUAL UNION ALL
SELECT '11-22-44' FROM DUAL UNION ALL
SELECT '22-22-33' FROM DUAL UNION ALL
SELECT '55-22-33' FROM DUAL UNION ALL
SELECT '11-66-33' FROM DUAL UNION ALL
SELECT '11-88-33' FROM DUAL UNION ALL
SELECT '33-88-33' FROM DUAL UNION ALL
SELECT '77-77-22' FROM DUAL UNION ALL
SELECT '11-77-77' FROM DUAL UNION ALL
SELECT '11-177-77' FROM DUAL UNION ALL
SELECT '11-77-771' FROM DUAL UNION ALL
SELECT '123-456-123' FROM DUAL UNION ALL
SELECT '1-2-2' FROM DUAL UNION ALL
SELECT '99999-99999-0' FROM DUAL UNION ALL
SELECT '1-2-3-4-5-6-7-8-9-0-11-2-13' FROM DUAL;

输出:

|价值 | |:-------------------------- | |22-22-33 | |33-88-33 | |77-77-22 | |11-77-77 | |123-456-123 | |1-2-2 | |99999-99999-0 | |1-2-3-4-5-6-7-8-9-0-11-2-13 |

db<>小提琴在这里

相关内容

  • 没有找到相关文章

最新更新