Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-仅包含特定数字的组合_Sql_Oracle_Select - Fatal编程技术网

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

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

有一个表(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:

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的原因。