2017-01-17 6 views

答えて

4

何かがすべてのRDBMSで動作します:

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

オラクル:Postgresのように、正規表現をサポートしているものについては

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

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

OP *は* Oracleを使用しています。チャンスは何ですか? :D – GurV

+0

標準的なSQLはnullの問題のためにOracleで動作しないと私は信じています – Aleksej

+0

@alekそれは動作します。カラムがnullの場合、置換の結果はnullになります。* trueではない* – Bohemian

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 

例:

オラクルで

、チェックが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 

だから、正規表現のない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 
関連する問題