3

CASE ステートメントで REGEXP_LIKE を使用したい

2つの質問

  1. この CASE ステートメントで REGEXP_LIKE を機能させるにはどうすればよいですか? 次のエラー メッセージが表示されます ORA-00904: "TRUE": invalid identifier

  2. 正規表現について、select '12345678' from dualクエリが返されるのはなぜ1ですか?

正規表現ルール

0 ~ 6 桁、その後に 0 または 1 個の小数点、その後に 0 ~ 6 桁。

with expression_row as 
(select 'zzzz'     as expression from dual union all
select '12345678' as expression from dual union all
select '12.33333' as expression from dual union all
select '.222222'  as expression from dual)
select 
expression,
       case regexp_like( expression, '^\d{0,6}(\.{0,1}\d{0,6})$') 
      -- [0-6 digits][0-1 decimal][0-6 digits]
       when TRUE then 'Y'
       else 'N'
      end as valid_y_n
    from expression_row; 

望ましい出力

zzzz     N
12345678 N
12.33333 Y
.222222  Y

このクエリを使用して正規表現パターンを検証しています。

select 1 as valid from dual 
where regexp_like( '12345678', '^\d{0,6}\.{0,1}\d{0,6}$');
4

2 に答える 2

7

1) 以下のコードを試してみてください - それがどこにあるかほど間違っているのは正規表現ではありません。SQL は、式を評価するときに、ほとんどの言語とは異なる方法で動作します。true を返してから、それを他の値と比較することはありません。条件または値が期待される場所に true を返す条件を配置する必要があります。

with expression_row as 
(select 'zzzz'     as expression from dual union all
select '12345678' as expression from dual union all
select '12.33333' as expression from dual union all
select '.222222'  as expression from dual)
select 
expression
,case 
   when regexp_like( expression, '^\d{0,6}(\.{0,1}\d{0,6})$')  -- [0-6 digits][0-1 decimal][0-6 digits]
   then 'Y'
   else 'N'
end as valid_y_n
from expression_row; 

2) 1 は SQL で TRUE を意味します。0 は FALSE です。これは、SQL がブール値の代わりにビットを使用するためです (ロジックの観点からは同じですが)。

于 2013-10-21T23:21:23.943 に答える