PDA

View Full Version : سوال: اگر % جزو رشته باشد؟



سهیل 25
دوشنبه 24 آبان 1389, 10:13 صبح
چگونه می توان زیر رشته ab%c را پیدا کرد؟

Rezahak
دوشنبه 24 آبان 1389, 10:18 صبح
اگر منظورتون استفاده از like است اين طوري :
WHERE fld like '%ab[%]c%'

سهیل 25
دوشنبه 24 آبان 1389, 10:21 صبح
اگر منظورتون استفاده از like است اين طوري :
WHERE fld like '%ab[%]c%'

ممنون بابت پاسخگوئی

منظورم همین بود که اگر % جزو رشته باشد با % که خود عملگر تطبیق در اس کیو ال می باشد اشتباه گرفته نمی شود یا نه؟

Rezahak
دوشنبه 24 آبان 1389, 10:25 صبح
منظورم همین بود که اگر % جزو رشته باشد با % که خود عملگر تطبیق در اس کیو ال می باشد اشتباه گرفته نمی شود یا نه؟

در sql server هر عبارتي كه جزو عبارات كليدي است و شما مي خواهيد به عنوان رشته از آن استفاده كنيد را بايد داخل [] قراردهيد

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 10:31 صبح
به جاي استفاده از Like ميتونيد بصورت زير هم عمل كنيد (بدون نياز به اضافه كردن [] به كاراكترهاي خاص)

Select * from Table Name Where CHARINDEX('ab%c', Fieldname) <> 0

سهیل 25
دوشنبه 24 آبان 1389, 10:31 صبح
در sql server هر عبارتي كه جزو عبارات كليدي است و شما مي خواهيد به عنوان رشته از آن استفاده كنيد را بايد داخل [] قراردهيد

ممنون ، درسته منظورم همین بود.

با تشکر

سهیل 25
دوشنبه 24 آبان 1389, 10:46 صبح
به جاي استفاده از Like ميتونيد بصورت زير هم عمل كنيد (بدون نياز به اضافه كردن [] به كاراكترهاي خاص)

Select * from Table Name Where CHARINDEX('ab%c', Fieldname) <> 0

ممنون

میشه کمی در مورد این دستوری که نوشتین توضیح بدین؟

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 10:51 صبح
میشه کمی در مورد این دستوری که نوشتین توضیح بدین؟
تابع CharIndex رشته اي كه به عنوان پارامتر اول معرفي شده رو توي رشته دوم جستجو ميكنه در صورت وجود شماره كاراكتر شروع اونو برميگيردونه اگر هم پيدا نكنه 0 برميگردونه.
توي دستور بالا گفته شده هر جايي كه جستجو رشته ab%c مقدار 0 برنگردوند (اين رشته وجود داشت) رو نمايش بده.

Rezahak
دوشنبه 24 آبان 1389, 10:52 صبح
اين دستور پارامتر اول را در پارامتر دوم جستجو مي كند و اگر پيدا شود جاي آن را بر مي گرداند وگر نه صفر برمي گرداند . به طور كلي استفاده از آن به جاي like به دو دليل خوب نيست :
1- سرعت آن به دليل اينكه يك تابع است بسيار كندتر از like است .
2- پارامتر اول حداكثر بايد 8000 كاراكتر باشد نه بيشتر

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 11:01 صبح
1- سرعت آن به دليل اينكه يك تابع است بسيار كندتر از like است .
عملكرد دستور Like هم با اين تابع يكي است (در نمونه مثالي كه خودتون نوشتيد)
از نظر سرعت هم اكثر توابع خود SQL سرباري ندارند.
ميتونيد اين رو روي يك جدول با حدود 1 ميليون ركورد تست كنيد.

Rezahak
دوشنبه 24 آبان 1389, 11:10 صبح
از نظر سرعت هم اكثر توابع خود SQL سرباري ندارند.


منظور من از نظر تفاوت سرعت سربار نبود. استفاده اين تابع به جاي like بود .
همانطور مي دانيد like فقط دنبال تطابق يك رشته با يك رشته ديگر مي گردد ولي تابع مذكور علاوه بر تطابق به دنبال محل شروع آن نيز مي گردد كه همين عملكرد اضافي باعث زمانبري بيشتر مي شود . هر چند كه يك ميليون ركورد با طول رشته اي كوچك نمي تواند data بزرگي براي تست تفاوت زماني اين دو باشد.
پيشنهاد مي كنم الگوريتمهاي استاندارد براي پياده سازي اين دو عملكرد را در اينترنت جستجو فرماييد تا متوجه تفاوت زماني آنها با هم شويد

Reza_Yarahmadi
دوشنبه 24 آبان 1389, 11:48 صبح
منظور من از نظر تفاوت سرعت سربار نبود. استفاده اين تابع به جاي like بود .
همانطور مي دانيد like فقط دنبال تطابق يك رشته با يك رشته ديگر مي گردد ولي تابع مذكور علاوه بر تطابق به دنبال محل شروع آن نيز مي گردد كه همين عملكرد اضافي باعث زمانبري بيشتر مي شود . هر چند كه يك ميليون ركورد با طول رشته اي كوچك نمي تواند data بزرگي براي تست تفاوت زماني اين دو باشد.
پيشنهاد مي كنم الگوريتمهاي استاندارد براي پياده سازي اين دو عملكرد را در اينترنت جستجو فرماييد تا متوجه تفاوت زماني آنها با هم شويد براي اينكه يك موقع حرفم اشتباه نباشه دو كوئري رو روي يك جدول با 1000000 ركورد كه همه داراي يك فيلد با حدود 2000 كاركتر امتحان كردم.
استفاده از Like حدود 2:01
استفاده از CharIndex حدود 2:09
كه اين اختلاف هم ممكنه بخاطر شرايط سيستمي باشه.

sarekh
دوشنبه 24 آبان 1389, 22:16 عصر
سلام
خدا خیرتان بده با این پستی که گذاشتید به من یکی که کمک بزرگی کردید. واقعا ممنونم ازتون

ASKaffash
سه شنبه 25 آبان 1389, 08:53 صبح
پيشنهاد مي كنم الگوريتمهاي استاندارد براي پياده سازي اين دو عملكرد را در اينترنت جستجو فرماييد تا متوجه تفاوت زماني آنها با هم شويد
سلام
شما یک لینک خوب در این خصوص سراغ دارید ؟

Rezahak
سه شنبه 25 آبان 1389, 09:40 صبح
سلام
شما یک لینک خوب در این خصوص سراغ دارید ؟

http://en.wikipedia.org/wiki/String_searching_algorithm
http://www-igm.univ-mlv.fr/~lecroq/string/
http://www.concentric.net/~ttwang/tech/stringscan.htm