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