عنوان:

‫محاسبه تعداد تکرار یک کلمه در یک رشته


نویسنده: محمد سلیم آبادی
تاریخ: ۱۳۹۱/۱۰/۲۹ ۱۶:۴۰
آدرس: www.dntips.ir
گاهی در راه حلهایمان نیاز داریم که تعداد تکرار یک کلمه در یک رشته را بدست آوریم. مثلا در عبارت "محمد محمد علی محمد محمد علی رضا جواد" کلمه محمد 4 بار تکرار شده و کلمه علی 2 دفعه. هدف ما پیدا کردن این اعداد هست.

برای بدست آوردن تعداد تکرار یک کلمه در یک رشته مراحل زیر را طی کنید:

1- اگر در رشته بین کلمات تنها یک فاصله بود آن را به دو فاصله تبدیل کنید.
2- اگر ابتدا و انتهای رشته فاصله وجود نداشت فاصله اضافه کنید.
3- طول رشته بعد از حذف کلمات مشابه کلمه مورد نظر را از طول رشته تفریق کنید و عدد حاصل را تقسیم به طول کلمه مورد نظر کنید
DECLARE @S VARCHAR(50) = 'ali ali ali ali hasan reza ali javad reza reza'


SELECT D.value, E.cnt
  FROM (VALUES ('ali'),
               ('hasan'),
               ('reza'),
               ('javad')) AS D(value)
       CROSS APPLY
       (SELECT ' ' + REPLACE(@s, ' ', '  ') + ' ') AS C(String)
       CROSS APPLY
       (SELECT (LEN(String) - LEN(REPLACE(String, ' ' + D.value + ' ', ''))) / (LEN(D.value) + 2)) AS E(cnt)
 ORDER BY cnt DESC;
در اسکریپت فوق تعداد تکرار شدن برخی از کلمات موجود در رشته مذکور مشخص خواهد شد.
خروجی کوئری فوق برابر است با:


نظرات

  • مهمان در ۱۳۹۱/۱۰/۲۹ ۱۷:۲

    به نظر من راه بهتر و عمومی حل این نوع مسایل استفاده از تابع split یا tokenizer هست بعد پردازش روی نتیجه نهایی.

    • محمد سلیم آبادی در ۱۳۹۱/۱۰/۲۹ ۱۸:۵۰
      Split کردن به عنوان روش کلی خیلی خوب، اما وقتی مساله رو میشه بدون درگیر شدن با بحث Splitting بسادگی حل نمود چرا باید سراغ روش پر هزینه‌تر رفت؟!
      فقط توجه داشته باشید که ما قصد داریم تنها تکرار یک کلمه را بررسی کنیم نه تمام کلمات. بله اگه قرار بر این باشد که تمام کلمات را تفکیک شده داشته باشیم و تعداد آنها را بدست آوریم ناچارا باید سراغ splitting رفت.