2016-12-28 43 views
0

我保留表格行上的數據,如下所示;Oracle正則表達式使用而不是INSTR函數

t_course

+------+------------------------------------------+ 
| sid | courses         | 
+------+------------------------------------------+ 
| 1 | cs101.math102.ns202-2.phy104   | 
+------+------------------------------------------+ 
| 2 | cs101.math201.ens202-1.phy104-10.chm105 | 
+------+------------------------------------------+ 
| 3 | cs101.ns202-2.math201.ens202-1.phy104 | 
+------+------------------------------------------+ 

現在,我要帶的課程中提到的同時NS202和ens202的總和。通常它應該只帶來記錄哪個id是3,它帶來所有的記錄(因爲instr)。我爲此使用了許多方法,但它不起作用。例如;

select count(*) from 
    t_course 
     where 
      instr(courses, 'ns202') > 0 
     and instr(courses, 'ens202') > 0; 

上面的代碼無法正常工作,因爲它需要ns202,但ens202本身包含ns202。我試圖使用正則表達式,我將所有課程轉換爲行(拆分),但這既破壞了工作邏輯,也減慢了速度。

我怎樣才能做到這一點與正則表達式而不是instr按照開頭(例如ns202%)邏輯? (從ns202開始或在點後面開始)

+0

你想同時擁有'ns202'和'ens202'的行嗎? –

+0

@vkp,是的,我只想要包含ns202和ens202的記錄總和。 –

+0

這是什麼意思*總和記錄*在這裏? –

回答

2

您可以使用帶字邊界的regexp_like來獲取既有ns202又有ens_202的行。通常情況下,您會使用\b作爲單詞邊界。由於Oracle不支持它,替代方案是使用(\s|\W)與開始^和結束$錨點。

\s - 空格字符,\W - 非單詞字符。根據需要添加更多字符作爲基於您的要求的字邊界。

select * 
from t_course 
where regexp_like(courses,'(^|\s|\W)ns202(\s|\W|$)') 
and regexp_like(courses,'(^|\s|\W)ens202(\s|\W|$)') 
+0

非常感謝您的幫助。 –

1

您將有同樣的問題ens202,順便說一句 - 如果什麼也有cens202tens202

你可以用正則表達式解決你的問題。您也可以與LIKE操作解決它:

select <whatever> 
from <table or tables> 
where (courses like 'ns202%' or courses like '%.ns202%') 
    and (courses like 'ens202%' or courses like '%.ens202%') 

您可以測試這兩種方法,看看哪一種最適合您的數據。