2016-06-20 132 views
0

給定一個表,其中包含數據類型VARCHAR2(20 BYTE)NO_TELEPHONE列,其中包含10位或4位電話號碼。我必須確保每個號碼的最後4位都是唯一的(所以00000011111111不能同時存在)。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」後,一些(看不見?)字符,因此需要後,「%」 LIKE表達式中的'1111'。 –

+2

如果您使用這些過濾器找到['dump()'values](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而不是字符 – scaisEdge

相關問題