Oracle SQL,varchar2,与数字一样

时间:2016-06-20 11:15:28

标签: sql oracle sql-like

根据数据类型为NO_TELEPHONE的{​​{1}}列,其中包含10位或4位数的电话号码。我必须确保每个数字的最后4位数字都是唯一的(因此VARCHAR2(20 BYTE)0000001111不能同时存在)。

我试过这个:

1111

但它找到0结果,我真的不明白为什么。

经过一些尝试后,我得到了结果:

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

如果我在表中有SELECT * from table where NO_TELEPHONE like '1111%'; SELECT * from table where NO_TELEPHONE like '______1111%'; (there is 6 '_' ) 并且我想要插入0000,那么程序将执行:

0000001111

它将与0000001111匹配,这不是我想要的行为

2 个答案:

答案 0 :(得分:2)

尝试使用RTRIM

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

答案 1 :(得分: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}?$' ) );