2016-04-14 51 views
1

我有一個場景,我們需要檢查字符串是否有'|'如果不是,則將這些行標記爲'錯誤'。檢查值是否爲'|'用SQL字符串分隔

僞數據一樣 -

create table test_2 (acc_no number, prod_svc varchar2(100), done varchar2(50)); 

insert into test_2 values (1001, '1234_first', null); 
insert into test_2 values (1002, '1234_first|5678_secong', null); 
insert into test_2 values (1001, '1234_first:5678_second', null); 

現在這3行,而第三行是錯誤,因爲是第一次兩排都沒有錯誤中「:」作爲分隔符。

因爲我寫了一個查詢,只有當有'|'但不是當有單個值,即第一排

update test_2 
    set done = 'prevalidation-error' 
where acc_no in( select acc_no 
         from test_2 
        where instr(prod_svc, '|') < 1) ; 

我的這個更新語句標誌着第一和第三的錯誤,而它不應該標記第一列作爲錯誤,因爲這是隻有一個值。 正如我們看到我的查詢是完美的情況可能是我們需要爲此編寫一個PLSQL塊,但我仍然無法找到一種方式,我將如何知道prod_svc列只有1個值,要正確!

我使用--- Oracle數據庫12c的企業版發行12.1.0.2.0 - 64位生產

回答

3

你似乎在尋找除了字母,數字,下劃線或豎條其他任何字符。因此,使用regexp_like()

update test_2 
    set done = 'prevalidation-error' 
    where regexp_like(acc_no, '[^|a-zA-Z0-9_]'); 
+0

但這種說法是n不是標誌着最後一排的錯誤 因爲該字符串沒有被「分離|」它使用':'作爲分隔符,我認爲這不是acc_no,而是prod_svc! – mradul

+1

@mradul你測試過嗎?它確實包含一個不在'| a-zA-Z0-9_'範圍內的字符,在這種情況下是';' – SomeJavaGuy

+0

是的,我測試它,但改變了regexp_like() prod_svc和我的好 它正在工作:) – mradul

0

當你想排除樣品分隔符「;:」

UPDATE test_2 
    SET done = 'prevalidation-error' 
WHERE REGEXP_COUNT (prod_svc, '[,;:]') > 0 
+0

這是不正確的 - 它會將單值字符串標記爲「錯誤」。爲什麼使它如此複雜,而不是regexp_count(prod_svc,',;:')> 0? – mathguy

+0

@mathguy錯誤?你測試過了嗎?對於複雜性你有權利。修復。 – Mottor

+0

呃......不,我沒有,現在回想起來你是對的,這是對的;對於單值字符串,不會有錯誤,因爲不會分割字符串(所以計數爲1)。我立場糾正。 – mathguy

相關問題