PDA

View Full Version : سوال: مشکل در کوئری



Mask
یک شنبه 15 مرداد 1391, 17:45 عصر
با سلام.
در برنامه ای یه کوئری به شکل زیر مینویسم.

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Append('select * from table1 where (Name like ''%'+Edit1.Text+'%'')');
ADOQuery1.Open;
در بانکم هم در یکی از رکوردها مثلا اسمی دارم مانند : علی احمدی
اگه در ادیت بنویسم علی احمدی ، پیداش میکنه ، اما اگه بنویسم احمدی علی ، چیزی پیدا نمیکنه.
چرا با اینکه جستجوی من لایک هست. بازم این مشکل به وجود میاد و راه حل چیه؟
ممنون.

mohammadriano
یک شنبه 15 مرداد 1391, 18:08 عصر
با سلام.
در برنامه ای یه کوئری به شکل زیر مینویسم.

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Append('select * from table1 where (Name like ''%'+Edit1.Text+'%'')');
ADOQuery1.Open;
در بانکم هم در یکی از رکوردها مثلا اسمی دارم مانند : علی احمدی
اگه در ادیت بنویسم علی احمدی ، پیداش میکنه ، اما اگه بنویسم احمدی علی ، چیزی پیدا نمیکنه.
چرا با اینکه جستجوی من لایک هست. بازم این مشکل به وجود میاد و راه حل چیه؟
ممنون.
دوست عزیز دقیقاً like قدرت خودش رو نسبت به "=" جایی نشون میده که شما به جای یک یا چند حرف که نمی دونید از کارکتر "*" استفاده کنید.
همین و بس
موفق باشی

Mask
یک شنبه 15 مرداد 1391, 19:16 عصر
دوست عزیز دقیقاً like قدرت خودش رو نسبت به "=" جایی نشون میده که شما به جای یک یا چند حرف که نمی دونید از کارکتر "*" استفاده کنید.
همین و بس
موفق باشی

یعنی چی. بیشتر توضیح بدید؟

BORHAN TEC
یک شنبه 15 مرداد 1391, 19:49 عصر
سلام اخوی، :قلب:
ببین اون like که نوشتی زیاد ربطی به این کاری که می خواهی بکنی نداره. خوب من سعی می کنم که در زیر توضیح بدم.

کاربرد like: در بعضی از موارد ممکن است بخواهیم به دنبال عباراتی بگردیم که که فقط چند حرف از آنها را میدانیم. به عنوان مثال ما می خواهیم به دنبال تمام عباراتی بگردیم که در آنها عبارات CDE وجود دارد(چه در اول عبارت، چه در وسط و چه در آخر عبارت) بنابراین از %CDE% استفاده می کنیم.
- حال می خواهیم به دنبال عبارتی بگردیم که در اول آنها CDE وجود دارد، بنابراین از عبارت زیر استفاده می کنیم:
CDE%
- حال می خواهیم به دنبال عباراتی بگردیم که در آخر آنها عبارت CDE وجود دارد بنابراین باید از عبارت زیر استفاده کنیم:
%CDE
حال مثلاً اگر بخواهیم که فقط عباراتی که برابر CDE هستند جستجو شوند به جای عملگر Like از = استفاده می کنیم. در این حالت اگر در بین رکوردهای ما رکوردی برابر CDEFG باشد نادیده گرفته می شوند و فقط رکوردهایی که برابر CDE هستند در نتیجه جستجوی ما قرار می گیرند.

متوجه شدی؟:متفکر:

حالا اون چیزی که تو می خوای رو باید به صورت زیر بنویسی:
select * from employee where first_name like '%ru%' and first_name like '%e%'
حالا اگه مثلاً سه عبارتی بود مثل زیر:
select * from employee where first_name like '%بابک%' and first_name like '%کچلی%' and first_name like '%اصل%'

OK؟ :لبخند:

mohammadriano
یک شنبه 15 مرداد 1391, 20:25 عصر
با کسب اجازه از استاد شاهین عشایری
فکر می کنم این روش دقیقاً مشکل شما رو برطرف کنه
از 2 تا Button استفاده کنید
رویداد کلیک یکی از Button ها که میشه همین کدی که خودتون نوشتین
رویداد کلیک بعدی :
رشته های خودتون رو تا رسیدن به Ascii کد : 32 یا " " جدا کنید.
و سپس کوئری خودتون رو به این شکل دربیارید:
select * from TableName where name like '*احمدی*' or name like '*علی*'

BORHAN TEC
یک شنبه 15 مرداد 1391, 21:32 عصر
با کسب اجازه از استاد شاهین عشایری
فکر می کنم این روش دقیقاً مشکل شما رو برطرف کنه
از 2 تا Button استفاده کنید
رویداد کلیک یکی از Button ها که میشه همین کدی که خودتون نوشتین
رویداد کلیک بعدی :
رشته های خودتون رو تا رسیدن به Ascii کد : 32 یا " " جدا کنید.
و سپس کوئری خودتون رو به این شکل دربیارید:
select * from TableName where name like '*احمدی*' or name like '*علی*'
کدی که شما نوشته اید درست نیست چونکه باید از and استفاده کنید.

سعید صابری
یک شنبه 15 مرداد 1391, 21:57 عصر
فکر کنم بشه از Full text search هم استفاده کنید.

mohammadriano
یک شنبه 15 مرداد 1391, 22:01 عصر
کدی که شما نوشته اید درست نیست چونکه باید از and استفاده کنید.
تست کردم هم AND جواب میده هم OR

90816

90817
خیلی جالب بود

BORHAN TEC
یک شنبه 15 مرداد 1391, 22:34 عصر
اشتباه می کنید.
جناب Gold می خواهند که اگر مثلاً "ابراهیمی فر" و یا "فر ابراهیمی" بنویسند نتیجه را ببینند ولی با دستوری که شما نوشته اید حتی اگر "محمدی فر" هم داشته باشیم در تنایج جستجو نمایش می یابد که هدف ما در اینجا این نیست و در نتیجه کوئری شما اشتباه است و در اینجا باید حتماً و حتماً از and استفاده شود.

mohammadriano
دوشنبه 16 مرداد 1391, 03:12 صبح
اشتباه می کنید.
جناب Gold می خواهند که اگر مثلاً "ابراهیمی فر" و یا "فر ابراهیمی" بنویسند نتیجه را ببینند ولی با دستوری که شما نوشته اید حتی اگر "محمدی فر" هم داشته باشیم در تنایج جستجو نمایش می یابد که هدف ما در اینجا این نیست و در نتیجه کوئری شما اشتباه است و در اینجا باید حتماً و حتماً از and استفاده شود.
بله دقیقا درست هست

Mask
دوشنبه 16 مرداد 1391, 11:21 صبح
ممنون وستان عزیز.
دقیقا منظور من مونیه که اقای عشایری فرمودند.
داستان اینه که کلمات من که یکی 2 تا نیست.
من تو بانکم ممکنه 1000 کلمه 2 تکه داشته باشم : مانند : احمدی فر - رضایی نصب - غلام زاده و ...
و همچنین یک ادیت برای وارد کردن کلمه مورد نظرم.
حالا با این تفاسیر کوئری من چی میشه : اگه نوشتم نصب رضایی و یا رضایی نصب برام یه خروجی بده و همه کلمات دیگه .
من اینو نوشتم : آیا درسته؟


ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Append('select * from table1 where (Name like ''*'+Edit1.Text+'*'')');
ADOQuery1.Open;

mohsen24000
دوشنبه 16 مرداد 1391, 12:20 عصر
من اینو نوشتم : آیا درسته؟


ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Append('select * from table1 where (Name like ''*'+Edit1.Text+'*'')');
ADOQuery1.Open;
باسلام خدمت دوست خوبم.
خیر این کوئری چیزی که مدنظر شماست رو تأمین نمی کنه!
شما بهتره عبارت داخل ادیت باکست رو تبدیل به کلمات جدا از هم بکنید و هر کدام را در یک شرط and قرار بدید تا ترتیب کلمات در هنگام جستجو نادیده گرفته بشه!
---------------------------------------------------
در ضمن پیشنهاد می کنم سوالات TSQL رو در همان قسمت مربوطه در سایت مطرح کنید تا به پاسخ های دقیق تر و بهتری برسید.

Mask
دوشنبه 16 مرداد 1391, 15:02 عصر
باسلام خدمت دوست خوبم.
خیر این کوئری چیزی که مدنظر شماست رو تأمین نمی کنه!
شما بهتره عبارت داخل ادیت باکست رو تبدیل به کلمات جدا از هم بکنید و هر کدام را در یک شرط and قرار بدید تا ترتیب کلمات در هنگام جستجو نادیده گرفته بشه!
---------------------------------------------------
در ضمن پیشنهاد می کنم سوالات TSQL رو در همان قسمت مربوطه در سایت مطرح کنید تا به پاسخ های دقیق تر و بهتری برسید.

ممنون داداش
چطوری باید جدا کنم. میشه یه مثال بزنید.

Mahmood_M
دوشنبه 23 مرداد 1391, 13:57 عصر
var
SL : TStringList;
QText : String;
I: Integer;
begin
SL := TStringList.Create;
QText := 'SELECT * FROM tblname WHERE fname LIKE';
try
SL.Delimiter := ' ';
SL.DelimitedText := Trim(Edit1.Text);
for I := 0 to SL.Count - 1 do
begin
if I = SL.Count - 1 then
QText := QText + ' %'+SL[I]+'%'
else
QText := QText + ' %'+SL[I]+'% AND fname LIKE';
end;
finally
SL.Free;
end;
end;