2016-06-20 47 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

相关问题