【问题标题】:how to find consecutive repetitive characters in oracle column如何在oracle列中查找连续的重复字符
【发布时间】:2014-05-11 01:45:11
【问题描述】:

有没有办法在oracle表的varchar列中找到连续的重复字符,如1414、200200。 我们如何使用正则表达式来实现它?

我无法使用正则表达式实现它 我的例子我可以得到一个数字的连续重复,但不是一个模式

select regexp_substr('4120066' ,'([[:alnum:]])\1', 7,1,'i') from dual; -- 得到预期的输出

select regexp_substr('6360360' ,'([[:alnum:]])\1', 7,1,'i') from dual; -- 我也想选择这个,因为我有 360,然后是 360

【问题讨论】:

  • 澄清一下,200以内的0不应该算一组重复字符吗?
  • 是的。这里我将 200 视为一组

标签: regex oracle


【解决方案1】:

你应该可以使用这样的东西:

[...] WHERE REGEXP_LIKE(field, '(\d+?)\1')

如果您正在寻找任何重复的字符,或者:

[...] WHERE REGEXP_LIKE(field, '^(\d+?)\1$')

如果要检查字段中的整个字符串。

\d+? 将匹配数字。

( ... ) 将存储这些数字。

\1 指的是捕获的数字。

注意:如果您不只检查数字,请将 \d 更改为 .

【讨论】:

    【解决方案2】:

    试试这个:

    SQL> WITH t AS
      2           (SELECT '1414,200200,11,12,33,33,1234,1234' test_string
      3              FROM DUAL)
      4      SELECT     LTRIM (SYS_CONNECT_BY_PATH (test_string, ','), ',') names
      5            FROM (SELECT ROW_NUMBER () OVER (ORDER BY test_string) rno, test_string
      6                    FROM (SELECT DISTINCT REGEXP_SUBSTR (test_string,
      7                                                         '[^,]+',
      8                                                         1,
      9                                                         LEVEL
     10                                                       ) test_string
     11                                    FROM t
     12                              CONNECT BY LEVEL <=
     13                                              LENGTH (test_string)
     14                                            - LENGTH (REPLACE (test_string,
     15                                                               ',',
     16                                                               NULL
     17                                                              )
     18                                                     )
     19                                           + 1))
     20          WHERE CONNECT_BY_ISLEAF = 1 AND ROWNUM = 1
     21     CONNECT BY rno = PRIOR rno + 1;
    
    NAMES
    --------------------------------------------------------------------------------
    11,12,1234,1414,200200,33
    

    没有分隔字符串重复!

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 2019-11-23
      • 1970-01-01
      • 2013-04-25
      • 2020-01-16
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多