2013-10-21 62 views
2

我想在我的CASE語句中使用REGEXP_LIKE如何在CASE語句中使用REGEXP_LIKE?

2個問題

  1. 我怎樣才能REGEXP_LIKE在這個CASE語句工作? 我收到以下錯誤消息 ORA-00904: "TRUE": invalid identifier

  2. 重正則表達式時,爲什麼select '12345678' from dual查詢返回1

正則表達式規則

0至6位,接着爲0或1小數點,後面跟着0到六位數字。

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}$'); 
+1

你的表達式與'12345678'中的'78'匹配,因爲你開始匹配'^'行首,'0-6'數字,然後查找十進制'0或1'時間,這是與使其成爲可選項例如'\。?',後跟'0-6'數字一樣。如果你不希望它匹配,則刪除'{0,1}'例如'^ \ d {0,6}(\。\ d {0,6})$' – hwnd

回答

4

1)嘗試下面的代碼 - 它不是正確的錯誤,因爲它的位置在哪裏。在評估表達式時,SQL以與大多數語言不同的方式工作 - 它不返回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使用位而不是bools(儘管它們從邏輯角度來看是相同的)。