zun*_*arz 3 regex sql case oracle11g
我想在我的CASE语句中使用REGEXP_LIKE
2个问题
如何让REGEXP_LIKE在此CASE语句中工作?我收到以下错误消息
ORA-00904: "TRUE": invalid identifier
重新正则表达式,为什么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)
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(尽管从逻辑角度来看它们是相同的).