2016-06-20 3 views
0

Учитывая таблицу с столбцом NO_TELEPHONE данных типа VARCHAR2(20 BYTE), которые содержат 10- или 4-значные номера телефонов. Я должен обеспечить, чтобы последние 4 цифры каждого числа были уникальными (так что 0000001111 и 1111 не могли оба существовать).Oracle SQL, varchar2, как с номером

Я попытался это:

SELECT * from table where NO_TELEPHONE like '%1111';` 

Но он нашел 0 результат, я действительно не понимаю, почему.

После нескольких попыток, я получил результаты с:

SELECT * from table where NO_TELEPHONE like '1111%'; 
SELECT * from table where NO_TELEPHONE like '______1111%'; (there is 6 '_') 

Если у меня есть 0000001111 в таблице, и я хочу вставить 0000, так что программа будет делать:

SELECT * from table where NO_TELEPHONE like '0000%'; 

, и он будет соответствовать 0000001111 , не является поведением, которое я хотел

+2

Там должен быть какой-то (невидимый?) Символ после «1111» в этих строках, следовательно, потребность в «%» после «1111» в выражениях LIKE. –

+2

Если вы ['dump()' значения] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions055.htm) найдены с этими фильтрами, вы можете точно увидеть, что они действительно содержат. –

+0

@Zeldarck Я прибрал грамматику в сообщении, надеюсь, сделаю ее более ясной. Пожалуйста, просмотрите его, и если он не соответствует вашим требованиям, вы можете нажать ссылку «отредактировано X минут назад» и отменить редактирование. – MT0

ответ

1

Если вы хотите, чтобы выбрать данные, которые вы можете использовать:

SELECT RTRIM(no_telephone, CHR(13)||CHR(10)) AS no_telephone 
FROM table_name 
WHERE RTRIM(no_telephone, CHR(13)||CHR(10)) LIKE '%1111'; 

Однако, если вы хотите, чтобы исправить данные ::

UPDATE table_name 
SET no_telephone = RTRIM(no_telephone, CHR(13)||CHR(10)) 
WHERE SUBSTR(no_telephone, -2) = CHR(13)||CHR(10); 

Или, если есть больше вопросов, и вы хочу заменить все нецифровое то:

UPDATE table_name 
SET no_telephone = REGEXP_REPLACE(no_telephone, '\D+'); 

затем вы можете применять уникальность последних 4-х символов:

CREATE UNIQUE INDEX table_name__no_telephone__u 
    ON table_name (SUBSTR(no_telephone, -4)); 

и вы можете применять формат колонки с использованием:

ALTER TABLE table_name ADD CONSTRAINT table_name__no_telephone__chk 
    CHECK (REGEXP_LIKE(no_telephone, '^\d{4}\d{6}?$')); 
+0

Очень странно, он не работал с вашим регулярным выражением, но работал с этим: '^ (\ d {10} | \ d {4}) $' Спасибо! – Zeldarck

2

Попробуйте использовать RTRIM

SELECT * from table where RTRIM(NO_TELEPHONE, ' ' , chr(13), chr(10)) like '%1111'; 
+0

Хм, это звучит неплохо, но это порождает ошибку для char (10) и char (13), например «00936. 00000 -« Отсутствие выражения ». Это база данных Oracle – Zeldarck

+0

Да была ошибка ..CHR вместо char – scaisEdge