2013-05-28 60 views
0

算我使用下面的查詢:串上的Oracle SQL查詢

SELECT 
    CURRENT_AFFAIRS_ID, 
    IMPORTANT_EXAM 
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
    1362544236, 
    1363764599, 
    1363670667, 
    1363516827, 
    1363500146) 
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0 

顯示以下數據:

1363764599 Civil Services Exam, SSC Exams 
1363670667 Bank Exams, SSC Exams 
1363516827 Bank Exams, Civil Services Exam, SSC Exams 
1363500146 Civil Services Exam, SSC Exams 

我的要求是計數(字符串的出現以逗號分隔的數如。公務員考試)

我試圖通過java編碼來做到這一點。

但似乎太複雜的工作。

可以使用oracle的任何函數或數據庫端嗎?

+1

您使用Java有多遠? – heikkim

回答

3

從11g中,您可以嘗試REGEXP_COUNT

SELECT 
    CURRENT_AFFAIRS_ID, 
    IMPORTANT_EXAM , 
    regexp_count(IMPORTANT_EXAM , '[^,]+') 
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
    1362544236, 
    1363764599, 
    1363670667, 
    1363516827, 
    1363500146) 
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0 

Here is a sqlfiddle demo

1

您也可以使用regexp_replace剝離出來,除了逗號字符串中的一切快速和骯髒的選項,算上這些,並添加一個。這假定字符串是良構的。

SELECT 
    CURRENT_AFFAIRS_ID, 
    IMPORTANT_EXAM, 
    LENGTH(regexp_replace(IMPORTANT_EXAM, '[^,]', '')) + 1 AS EXAMS 
FROM CURRENT_AFFAIRS_LANGUAGE 
WHERE CURRENT_AFFAIRS_ID IN (
    1362544236, 
    1363764599, 
    1363670667, 
    1363516827, 
    1363500146) 
AND IMPORTANT_EXAM IS NOT NULL 
AND IS_ACTIVE = 1 
AND IS_DELETED = 0; 

SQL Fiddle

編輯:如果你是11g上,然後regexp_count甚至更​​好,因爲A.B.Cade顯示 - 使用如果你能。這regexp_replace選項將從10g的工作,所以我現在就把它留在這裏...

我不知道你爲什麼在一個字符串中存儲多個值,但。您應該將考試移至單獨的表格,然後製作映射表格,以顯示哪些考試可以使用哪種語言。