VARCHAR फ़ील्ड में एक स्ट्रिंग की घटनाओं की संख्या की गणना करें?


175

मेरे पास इस तरह की एक तालिका है:

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue

मैं यह पता लगाने की कोशिश कर रहा हूं कि प्रत्येक विवरण में स्ट्रिंग की संख्या कितनी होती है, इसे वापस कैसे करें।

इसलिए, यदि मैं 'मान' के प्रकट होने की संख्या को गिनना चाहता हूं, तो sql स्टेटमेंट इसे वापस कर देगा:

TITLE          |   DESCRIPTION                  |   COUNT
------------------------------------------------------------
test1          |   value blah blah value        |   2
test2          |   value test                   |   1
test3          |   test test test               |   0
test4          |   valuevaluevaluevaluevalue    |   5

क्या इसे करने का कोई तरीका है? मैं बिल्कुल php का उपयोग नहीं करना चाहता, बस mysql।


4
नीचे दिए गए जवाब आपको मिल जाएंगे। हालाँकि, यदि आप मल्टीबाइट पात्रों का उपयोग कर रहे हैं तो CHAR_LENGTH()इसके बजाय उपयोग करना न भूलें LENGTH()
इनहान

इस धागे का भी यहाँ
Delickate

नमस्ते, मैं कैसे sqlserver क्वेरी के साथ यह कर सकता हूँ?
anintno12u

LENGTH ([क्षेत्र]) - LENGTH (उत्तर (क्षेत्र), '[char_to_find]', '')
फीनिक्स

जवाबों:


343

यह काम कर जाना चाहिए:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table> 

55
यह समाधान भयानक है, बस मुझे क्या चाहिए! लेकिन ध्यान दें, कि LENGTH () बहु-बाइट सुरक्षित नहीं है और आप अजीब त्रुटियों में भाग सकते हैं। CHAR_LENGTH () का उपयोग करें :)
nico gawenda

1
वहाँ LENGTH()और CHAR_LENGTH()जबकि एक ही गिनती बाइट / चार में विभाजित का उपयोग करने में कोई अंतर नहीं है । @nicogawenda
मोहम्मद

3
@chyupa undevalueहै valueउस में तो यह गिनती की जानी चाहिए। यदि आप केवल पूर्ण शब्दों को गिनना चाहते हैं, तो शायद आपको 'वैल्यू' की खोज करने की आवश्यकता है या कुछ और जटिल जैसे रीगेक्स का उपयोग करना।
फोनिक्स

2
ध्यान दें कि जब आप पाठ के माध्यम से खोजते हैं तो आप गलत गणना में भाग लेते हैं, जिसमें बड़े अक्षरों के साथ शब्द भी होते हैं (जैसे जर्मन जहां सभी संज्ञाएं बड़े अक्षरों के साथ लिखी जाती हैं)। REPLACE केवल सटीक मैचों की जगह लेता है। ऊपर दिए गए प्रतिस्थापन को बदलने के लिए आपको सभी शब्दों पर विचार करना होगा: LENGTH( REPLACE ( LOWER(description), "value", "") )और सुनिश्चित करें कि PHP का उपयोग करके "मान" हमेशा नीचा हो strtolower()। पुनश्च: ऊपर दिए गए इस समाधान ने मुझे अपने छोटे से खोज इंजन के निर्माण और पाठ के भीतर शब्दों की संख्या से परिणाम प्राप्त करने में मदद की। धन्यवाद!
काई नैक

2
ROUNDयहाँ अनावश्यक है। की घटनाओं के xसाथ लंबाई की एक स्ट्रिंग मान । हमेशा आपको दे देंगे , मूल्य की लंबाई से हमेशा एक पूरी संख्या छोड़ देंगे । राउंड ऑफ करने की आवश्यकता नहींn'valueLENGTH(description) - LENGTH( REPLACE ( description, "value", "") ) n*length("value")n
निब्रिट

21

थोड़ा सा सरल और अधिक प्रभावी विविधता @yannis समाधान:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 

अंतर यह है कि मैं "मूल्य" स्ट्रिंग को 1-चार छोटी स्ट्रिंग (इस मामले में "1234") से बदल देता हूं। इस तरह आपको पूर्णांक मान प्राप्त करने के लिए विभाजित करने और राउंड करने की आवश्यकता नहीं है।

सामान्यीकृत संस्करण (प्रत्येक सुई स्ट्रिंग के लिए काम करता है):

SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table> 

1
विचार के लिए +1, हालांकि मैं आम तौर पर स्पष्ट कार्यान्वयन पसंद करता हूं, अर्थात, अतिरिक्त स्पष्टीकरण की आवश्यकता नहीं है, भले ही वे कम सुरुचिपूर्ण दिखें।
not2savvy


12

SQL SERVER में, यह उत्तर है

Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100))

INSERT INTO @t SELECT 'test1', 'value blah blah value' 
INSERT INTO @t SELECT 'test2','value test' 
INSERT INTO @t SELECT 'test3','test test test' 
INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' 


SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') 

FROM @t

परिणाम

TITLE   DESCRIPTION               Count
test1   value blah blah value        2
test2   value test                   1
test3   test test test               0
test4   valuevaluevaluevaluevalue    5

मैं MySQL स्थापित की जरूरत नहीं है, लेकिन लगता है LEN के बराबर है goggled लंबाई जबकि REPLACE में ही है।

तो MySql में बराबर क्वेरी होनी चाहिए

SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count
FROM <yourTable>

कृपया मुझे बताएं कि क्या यह MySql में भी आपके लिए काम करता है।


3

यहाँ एक फ़ंक्शन है जो ऐसा करेगा।

CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  BEGIN
    RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle));
  END;

1
SELECT 
id,
jsondata,    
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "sonal", "") ) 
    ) / LENGTH("sonal")        
)
+
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "khunt", "") ) 
    ) / LENGTH("khunt")        
)
AS count1    FROM test ORDER BY count1 DESC LIMIT 0, 2

धन्यवाद Yannis, आपके समाधान ने मेरे लिए काम किया और यहाँ मैं ऑर्डर और सीमा के साथ कई कीवर्ड के लिए एक ही समाधान साझा कर रहा हूं।


1

यह अंतरिक्ष तकनीक का उपयोग करके mysql फ़ंक्शन है (mysql 5.0 + 5.5 के साथ परीक्षण किया गया): CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.