如何在CASE语句中使用REGEXP_LIKE?

zun*_*arz 3 regex sql case oracle11g

我想在我的CASE语句中使用REGEXP_LIKE

2个问题

  1. 如何让REGEXP_LIKE在此CASE语句中工作?我收到以下错误消息 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; 
Run Code Online (Sandbox Code Playgroud)

期望的输出

zzzz     N
12345678 N
12.33333 Y
.222222  Y
Run Code Online (Sandbox Code Playgroud)

我正在使用此查询验证我的正则表达式模式.

select 1 as valid from dual 
where regexp_like( '12345678', '^\d{0,6}\.{0,1}\d{0,6}$');
Run Code Online (Sandbox Code Playgroud)

Joh*_*van 6

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; 
Run Code Online (Sandbox Code Playgroud)

2)1是SQL为TRUE; 0为FALSE.这是因为SQL使用位而不是bools(尽管从逻辑角度来看它们是相同的).