3

我想在我的 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; 

期望的输出

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 为假。这是因为 SQL 使用位而不是布尔(尽管从逻辑角度来看它们是相同的)。

于 2013-10-21T23:21:23.943 回答
0

改为使用 case when regex_instr(variable, 'regex') <> 0 then ...

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_instr(expression, '^\d{0,6}(\.{0,1}\d{0,6})$') <> 0 
          then 'Y' 
          else 'N'  
      end as valid_y_n
    from expression_row; 
于 2020-08-26T16:19:53.420 回答