একটি VARCHAR ক্ষেত্রে কোনও স্ট্রিংয়ের সংখ্যার সংখ্যা গণনা করুন?


175

আমার এই মত একটি টেবিল আছে:

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

আমি বর্ণনা করার চেষ্টা করছি যে সমস্ত বর্ণনার প্রতিটিটিতে স্ট্রিং সংখ্যার বারটি কীভাবে ফিরে আসবে।

সুতরাং, আমি যদি 'মান' প্রকাশিত বারের সংখ্যা গণনা করতে চাই, তাহলে বর্গক্ষেত্র বিবৃতি এটিকে ফিরিয়ে দেবে:

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

এই কাজ করতে কোন উপায় আছে কি? আমি পিএইচপি মোটেও ব্যবহার করতে চাই না, কেবল মাইএসকিএল।


4
নীচের প্রতিক্রিয়াগুলি আপনাকে সেখানে পাবেন। তবে আপনি যদি মাল্টিবাইট অক্ষর ব্যবহার করছেন তবে CHAR_LENGTH()পরিবর্তে ব্যবহার করতে ভুলবেন না LENGTH()
ইনহান

এই থ্রেডটিরও এখানে
51

হাই, আমি কীভাবে স্ক্যালসারভার ক্যোয়ারী দিয়ে এটি করব?
aintno12u

লেন্থ ([ক্ষেত্র]) - লেন্থ (রিপ্লেস ([ক্ষেত্র]], '[চর_ টো_ফাইন্ড]', ''))
ফিনিক্স

উত্তর:


343

এই কৌতুক করতে হবে:

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

55
এই সমাধানটি দুর্দান্ত, আমার যা প্রয়োজন! তবে মনে রাখবেন যে, LENGTH () মাল্টি-বাইট নিরাপদ নয় এবং আপনি সম্ভবত অদ্ভুত ত্রুটির মধ্যে পড়তে পারেন। পরিবর্তে CHAR_LENGTH () ব্যবহার করুন :)
নিকো গাওেন্ডা

1
একই গণনা বাইট / চরে বিভক্ত করার সময় LENGTH()এবং ব্যবহারে কোনও পার্থক্য নেই CHAR_LENGTH()। @nicogawenda
মোহামাদ

3
@chyupa এতে undevalueআছে valueতাই এটি গণনা করা উচিত। আপনি যদি কেবলমাত্র সম্পূর্ণ শব্দ গণনা করতে চান তবে আপনার 'রেগেক্স' ব্যবহারের মতো 'মান' বা আরও জটিল কিছু সমাধান করার দরকার রয়েছে।
ফোনিক্স

2
দ্রষ্টব্য যে আপনি যখন ভুল পাঠ্যগুলিতে অনুসন্ধান করেন তখন মূলধনযুক্ত অক্ষরের সাথেও শব্দ থাকে (যেমন জার্মান যেখানে সমস্ত বিশেষ্যকে বড় বড় অক্ষরে লেখা থাকে)। REPLACE কেবল সঠিক মিলগুলি প্রতিস্থাপন করে। সমস্ত শব্দ বিবেচনা করতে আপনার উপরের প্রতিস্থাপনটি পরিবর্তন LENGTH( REPLACE ( LOWER(description), "value", "") )করতে হবে : এবং নিশ্চিত করুন যে পিএইচপি ব্যবহার করে "মান" সর্বদা নিম্নের হয় strtolower()। পিএস: উপরের এই সমাধানটি আমাকে আমার নিজের সামান্য সার্চ ইঞ্জিন তৈরি করতে এবং পাঠ্যের মধ্যে শব্দের সংখ্যার দ্বারা ফলাফলকে ওজন করতে সহায়তা করেছে। ধন্যবাদ!
কাই নোক

2
ROUNDএখানে অপ্রয়োজনীয়। এর সংঘটনগুলির xসাথে দৈর্ঘ্যের একটি স্ট্রিং ধরে । সর্বদা আপনাকে দেবে , ডাইভিং করে যে দৈর্ঘ্যের দ্বারা সর্বদা একটি সম্পূর্ণ সংখ্যা ছেড়ে যায় । রাউন্ড অফ করার দরকার নেইn'valueLENGTH(description) - LENGTH( REPLACE ( description, "value", "") ) n*length("value")n
নিবিড়িত

21

@ অ্যানিস সমাধানের সামান্য সহজ এবং আরও কার্যকর প্রকরণ:

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

পার্থক্যটি হ'ল আমি "মান" স্ট্রিংটিকে 1-চর সংক্ষিপ্ত স্ট্রিংয়ের সাথে প্রতিস্থাপন করব ("1234" এই ক্ষেত্রে)। একটি পূর্ণসংখ্যার মান পেতে আপনাকে এইভাবে ভাগ এবং গোল করার দরকার নেই to

সাধারণ সংস্করণ (প্রতিটি সূঁচের স্ট্রিংয়ের জন্য কাজ করে):

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

এসকিউএল সার্ভারে এটি উত্তর

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

আমি মাইএসকিউএল ইনস্টল নেই, কিন্তু এটি LEN এর সমতুল্য বড় বড় নেত্রবিশিষ্ট LENGTH এর সময় REPLACE একই।

সুতরাং মাইএসকিউএলে সমমানের ক্যোয়ারী হওয়া উচিত

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

এটি মাইএসকিএলেও যদি আপনার পক্ষে কাজ করে তবে আমাকে জানান।


3

এখানে একটি ফাংশন যা এটি করবে is

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

ধন্যবাদ ইয়ান্নিস, আপনার সমাধানটি আমার পক্ষে কাজ করেছে এবং এখানে আমি একাধিক কীওয়ার্ডের জন্য একই সমাধানটি অর্ডার এবং সীমা সহ ভাগ করছি।


1

এটি স্পেস টেকনিক ব্যবহার করে মাইএসকিএল ফাংশন (মাইএসকিএল 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)) );

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.