我想打印出在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<>小提琴在这里