2011-11-17 12 views
25

कैसे मैं एक varchar2 स्ट्रिंग में चरित्र - की घटनाओं की संख्या की गणना कर सकते हैं?ओरेकल वर्कर मूल्य में किसी चरित्र की घटनाओं की संख्या को कैसे गिनें?

उदाहरण:

select XXX('123-345-566', '-') from dual; 
---------------------------------------- 
2 
+0

प्रदर्शन के बारे में हम दिलचस्प पाया 'REGEXP_COUNT' समाधान के बारे में 5 बार धीमी (अधिक CPU समय लगता है)' लंबाई लंबाई से (REPLACE()) 'दृष्टिकोण हो सकता है। ओरेकल 11.2.0.4 लिनक्स x86 64-बिट –

उत्तर

54

ये रहा:

select length('123-345-566') - length(replace('123-345-566','-',null)) 
from dual; 

तकनीकी तौर पर, यदि स्ट्रिंग आप जाँच करना चाहते हैं केवल चरित्र आप की गणना करना चाहते हैं, इसके बाद के संस्करण क्वेरी शून्य प्राप्त होगा; (क्योंकि लंबाई (शून्य यानी शून्य) = Oracle में शून्य)

select coalesce(length('123-345-566') - length(replace('123-345-566','-',null)), length('123-345-566'), 0) 
from dual; 

अंतिम 0 coalesce में कैच मामले ऐसे हैं जिनमें एक खाली स्ट्रिंग में गिनती कर रहे हैं: निम्न क्वेरी सभी मामलों में सही जवाब दे देंगे ।

+0

बहुत अच्छा यह जवाब;) – kevthanewversi

10

यहाँ एक विचार है: जगह सब कुछ है कि रिक्त स्ट्रिंग के साथ एक पानी का छींटा चार नहीं है की कोशिश करो। फिर गिनें कि कितने डैश बने रहे।

select length(regexp_replace('123-345-566', '[^-]', '')) from dual 
49

REGEXP_COUNT चाल करना चाहिए:

select (length('a') - nvl(length(replace('a','b')),0))/length('b') 
    from dual 

:

select REGEXP_COUNT('123-345-566', '-') from dual; 
+3

केवल ओरेकल 11. में समर्थित है। अच्छा समाधान हालांकि। – Flukey

+0

+1 यह जानना अच्छा है कि एक REGEXP_COUNT फ़ंक्शन भी है। – bpgergo

+0

शर्म। ध्यान नहीं दिया कि ओपी 10 जी – Borodin

2

मैं

SELECT LENGTH('123-345-566') - LENGTH(REPLACE('123-345-566', '-', '')) FROM DUAL; 
0
SELECT {FN LENGTH('123-345-566')} - {FN LENGTH({FN REPLACE('123-345-566', '#', '')})} FROM DUAL 
+0

पर था, आपको अपने कोड में कुछ स्पष्टीकरण भी प्रदान करना चाहिए। – brimborium

+0

यह किस तरह का वाक्यविन्यास है? – collapsar

+0

आपको कुछ स्पष्टीकरण – Faisal

1
यहाँ

के बारे में सोचा एक समाधान है कि दोनों पात्रों और सबस्ट्रिंग के लिए कार्य करेंगे है जहां एक स्ट्रिंग है जिसमें आप समुद्र करते हैं ख की घटना

आपका दिन शुभ हो आरसीएच!

0
select count(*) 
from (
     select substr('K_u_n_a_l',level,1) str 
     from dual 
     connect by level <=length('K_u_n_a_l') 
    ) 
where str ='_'; 
+1

भी प्रदान करना चाहिए, जबकि यह कोड प्रश्न का उत्तर दे सकता है, इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करने से उत्तर के दीर्घकालिक मूल्य में सुधार होगा। – kayess

2

मुझे बहुत ही समस्या का सामना करना पड़ा ... लेकिन RegExp_Count इसे हल नहीं कर सका। कितनी बार स्ट्रिंग '16, 124,3,3,1,0, '', 3, 'है? हम 2 बार देखते हैं, लेकिन RegExp_Count रिटर्न सिर्फ 1. यही बात 'bbaaaacc' 'के साथ है और जब यह' आ 'में देख के रूप में - 3 बार किया जाना चाहिए और RegExp_Count रिटर्न सिर्फ 2.

select REGEXP_COUNT('336,14,3,3,11,0,' , ',3,') from dual; 
select REGEXP_COUNT('bbaaaacc' , 'aa') from dual; 

मैं कुछ समय के लिए खो दिया वेब पर समाधान शोध करने के लिए। 'नहीं मिला' ... इसलिए मैंने अपना स्वयं का फ़ंक्शन लिखा जो मौका की वास्तविक संख्या देता है। उम्मीद है कि यह उपयोगी होगा।

CREATE OR REPLACE FUNCTION EXPRESSION_COUNT(pEXPRESSION VARCHAR2, pPHRASE VARCHAR2) RETURN NUMBER AS 
    vRET NUMBER := 0; 
    vPHRASE_LENGTH NUMBER := 0; 
    vCOUNTER NUMBER := 0; 
    vEXPRESSION VARCHAR2(4000); 
    vTEMP VARCHAR2(4000); 
BEGIN 
    vEXPRESSION := pEXPRESSION; 
    vPHRASE_LENGTH := LENGTH(pPHRASE); 
    LOOP 
    vCOUNTER := vCOUNTER + 1; 
    vTEMP := SUBSTR(vEXPRESSION, 1, vPHRASE_LENGTH); 
    IF (vTEMP = pPHRASE) THEN   
     vRET := vRET + 1; 
    END IF; 
    vEXPRESSION := SUBSTR(vEXPRESSION, 2, LENGTH(vEXPRESSION) - 1); 
    EXIT WHEN (LENGTH(vEXPRESSION) = 0) OR (vEXPRESSION IS NULL); 
    END LOOP; 
    RETURN vRET; 
END;