SQL-仅包含特定数字的组合
有一个表(let T),其列(let C)仅包含数字。我希望使用select检索数字,这些数字仅为1、2、3的组合,如123123、111111、112113、231213等。请提供帮助。仅使用标准SQL且适用于所有RDBMS的内容:SQL-仅包含特定数字的组合,sql,oracle,select,Sql,Oracle,Select,有一个表(let T),其列(let C)仅包含数字。我希望使用select检索数字,这些数字仅为1、2、3的组合,如123123、111111、112113、231213等。请提供帮助。仅使用标准SQL且适用于所有RDBMS的内容: select c from t where replace(replace(replace(c, '1', ''), '2', ''), '3', '') = '' and length(c) > 0 对于支持正则表达式的用户,如Postgres: sel
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]+$');
仅使用标准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]+$');
只是要指出,标准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中,检查应针对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
只是要指出,标准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中,检查应针对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
OP正在使用Oracle。机会有多大我认为标准SQL无法在Oracle中工作,因为为空issues@alek它会起作用的。如果列为null,则替换的结果将为null,而不是“true”。我的意思是,即使列不为null,null也可能是检查中的一个问题。例如,<代码>选择案例,当“`=”和“true”,否则“false”结束从双< /COD>在Oracle中给出false。@ ALEK,我认为Oracle中的一个错误:令人难以置信的是,<代码>选择“当”是空的,然后是“true”,否则“false”结束从双< /代码>返回“true”!长度为零的字符串不为空。我找到了一个解决这个问题的方法。不使用Oracle的另一个原因是OP使用Oracle。机会有多大我认为标准SQL无法在Oracle中工作,因为为空issues@alek它会起作用的。如果列为null,则替换的结果将为null,而不是“true”。我的意思是,即使列不为null,null也可能是检查中的一个问题。例如,<代码>选择案例,当“`=”和“true”,否则“false”结束从双< /COD>在Oracle中给出false。@ ALEK,我认为Oracle中的一个错误:令人难以置信的是,<代码>选择“当”是空的,然后是“true”,否则“false”结束从双< /代码>返回“true”!长度为零的字符串不为空。我找到了一个解决这个问题的方法。另一个不使用Oracle的原因。