查找重复的数字序列(我不能使用正则表达式)

时间:2017-11-03 21:11:23

标签: sql oracle numbers matching

我需要创建一个函数,如果我出现4个重复数字或更多,则返回true。我使用的是Oracle 9i版本,因此我无法使用正则表达式。 e.g:

0000234567, 0111112345, 2333345678, 3333333333 

2 个答案:

答案 0 :(得分:3)

由于只有10个可能的数字,因此删除4个相等或更多数字序列的电话号码(根据您的评论)就像这样简单:

DELETE
FROM MyTable
WHERE
    phonenumber LIKE '%0000%' OR
    phonenumber LIKE '%1111%' OR
    phonenumber LIKE '%2222%' OR
    phonenumber LIKE '%3333%' OR
    phonenumber LIKE '%4444%' OR
    phonenumber LIKE '%5555%' OR
    phonenumber LIKE '%6666%' OR
    phonenumber LIKE '%7777%' OR
    phonenumber LIKE '%8888%' OR
    phonenumber LIKE '%9999%'

测试作为功能

CREATE OR REPLACE FUNCTION IsRepeatingDigit(s varchar2)
  RETURN number IS
BEGIN
  IF s LIKE '%0000%' OR
     s LIKE '%1111%' OR
     s LIKE '%2222%' OR
     s LIKE '%3333%' OR
     s LIKE '%4444%' OR
     s LIKE '%5555%' OR
     s LIKE '%6666%' OR
     s LIKE '%7777%' OR
     s LIKE '%8888%' OR
     s LIKE '%9999%'
  THEN
    RETURN 1;
  ELSE
    RETURN 0;
  END IF;
END;

我不会返回布尔值,因为布尔类型在Oracle中有所限制。您可以在PL / SQL中使用它,但不能在纯SQL中使用它。

答案 1 :(得分:0)

这将检查4个连续重复字符的字符串:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name ( value ) AS
SELECT '0000234567' FROM DUAL UNION ALL
SELECT '0111112345' FROM DUAL UNION ALL
SELECT '2333456789' FROM DUAL UNION ALL
SELECT '0123456666' FROM DUAL UNION ALL
SELECT '0123456789' FROM DUAL
/

CREATE FUNCTION check_For_Repeats(
  i_value   VARCHAR2,
  i_repeats INTEGER DEFAULT 4
) RETURN NUMBER
IS
  p PLS_INTEGER := 1;
  c CHAR(1)     := SUBSTR( i_value, p, 1 );
BEGIN
  IF i_repeats < 2 THEN
    RETURN NULL;
  END IF;

  FOR i IN 2 .. LENGTH( i_value ) LOOP
    IF SUBSTR( i_value, i, 1 ) = c THEN
      IF i >= p + i_repeats - 1 THEN
        RETURN 0;
      END IF;
    ELSE
      p := i;
      c := SUBSTR( i_value, p, 1 );
    END IF;
  END LOOP;
  RETURN 1;
END;
/

查询1

SELECT value, check_For_Repeats( value ) FROM table_name

<强> Results

|      VALUE | CHECK_FOR_REPEATS(VALUE) |
|------------|--------------------------|
| 0000234567 |                        0 |
| 0111112345 |                        0 |
| 2333456789 |                        1 |
| 0123456666 |                        0 |
| 0123456789 |                        1 |