SQL - 仅包含特定数字的组合

时间:2017-01-17 17:15:54

标签: sql oracle select

有一个表(让T),列(让C)只包含数字。我希望使用select来检索数字,这些只是1,223之类的组合,如123123,11111,112113,231213等。请帮助。

2 个答案:

答案 0 :(得分:4)

只使用标准SQL并且可以在所有RDBMS中使用的东西:

select c from t
where replace(replace(replace(c, '1', ''), '2', ''), '3', '') = ''
and length(c) > 0

对于那些支持正则表达式的人,比如Postgres:

select c from t
where c rlike '^[123]+$'

甲骨文:

select c from t
where regexp_like(c,'^[123]+$');

答案 1 :(得分:0)

只是指出标准SQL解决方案可能无法在Oracle中正常运行。

使用这样的表:

create table t(c) as (
                select '1233' from dual union all
                select '1XX3' from dual union all
                select 'XX'   from dual union all
                select ''     from dual 
             )

标准方法给出:

SQL> select c from t
  2  where replace(replace(replace(c, '1', ''), '2', ''), '3', '') = ''
  3    and c <> '';

no rows selected

原因在于Oracle处理空字符串的方式:

SQL> select c,
  2         case when replace(replace(replace(c, '1', ''), '2', ''), '3', '') = '' and c <> '' then 'MATCH'
  3              else 'NO MATCH'
  4         end as checkMatch
  5  from t;

C    CHECKMAT
---- --------
1233 NO MATCH
1XX3 NO MATCH
XX   NO MATCH
     NO MATCH

在一个简单的例子中:

SQL> select case when '' = '' then 'true' else 'false' end
  2  from dual;

CASEW
-----
false

在Oracle中,检查应针对NULL

SQL> select c,
  2         case when replace(replace(replace(c, '1', ''), '2', ''), '3', '') is null and c is not null then 'MATCH'
  3              else 'NO MATCH'
  4         end as checkMatch
  5  from t;

C    CHECKMAT
---- --------
1233 MATCH
1XX3 NO MATCH
XX   NO MATCH
     NO MATCH

所以没有regexp的Oracle解决方案可能是:

SQL> select c from t
  2  where replace(replace(replace(c, '1', ''), '2', ''), '3', '') is null
  3    and c is not null;

C
----
1233