ورود

View Full Version : مشخص کردن نام فیلد در contains_search_condition



titbasoft
چهارشنبه 20 مهر 1384, 15:22 عصر
سلام
من یه جدول دارم که برای بعضی از قیلدهاش ایندکس FTS تعریف شده. در حالت کلی و در قسمت جستجوی ساده راحت میام و از * به جای اسم فیلد استفاده میکنم. اما مشکل در جستجوی پیشرفته بوجود میاد ، به این صورت که توی قسمت جستجوی پیشرفته ممکنه کاربر برای بعضی از فیلدها مقادیر خاص مشخص کرده باشه حالا اینجا سوال پیش میاد که میشه یه جورایی توی همون پارامتر contains_search_condition از CONTAINS بشه اسم فیلد رو اورد به جای اینکه بنویسیم:

contains (..) and contains (...)
روش بالا این مشکل رو داره که مثلا نمیتونیم یک SP بنویسیم که این مساله رو هندل کنه (البته نه اینکه اصلا نشه. چون یه کم که در موردش فکر کردم فکر کنم بشه با یک متغیر به عنوان flag و XOR کردنش با هر کدوم از contains ها این مساله رو حل کرد. ولی خیلی دردسر داره)

اگر تونسته ام challenge رو توضیح بدم ممنون می شم اگه solution بدید!

AminSobati
پنج شنبه 21 مهر 1384, 21:56 عصر
هاشم جان من اگر چه یقین ندارم دقیق مطلب رو متوجه شده باشم، ولی حدس میزنم شما منظورتون این هست که مثلا روی فرم در کلاینت، سه Textbox وجود داره برای جستجوی FirstName, LastName و Age. کاربر ممکنه یکی یا همه Textboxها رو پر کنه. لذا مشخص نیست که دقیقا Where باید چه فیلدهایی رو دربر بگیره.
در چنین حالتی SP شما برای جستجو میتونه به این صورت باشه:


create proc MySearch
@LName varchar(50)=null,
@FName varchar(50)=null,
@Age tinyint=null
as
select * from MyTable where
(LastName=@LName) or (@LName is null)
and
(FirstName=@FName) or (@FName is null)
and
(Age=@Age) or (@Age is null)
go

titbasoft
شنبه 23 مهر 1384, 11:53 صبح
خیلی ممنون از توجهتون
راهی که شما فرمودید همون در نظر گفتن یک flag ای است که بهش اشاره کردم (چون من flag ام رو صفر و یک در نظر گرفته بودم به جای OR باید XOR میکردم) اما چیزی که من دنبالش می گردم اینه که این کار به طور خودکار انجام بشه.
برای واضح تر شدن مساله جستجوی پیشرفته google رو در نظر بگیرید. فرض کنید کل index ها توی یک جدولی هستند که یکی از فیلدهای اون site هست. و باز هم فرض کنید وقتی کاربر billgates site:microsoft.com رو search می کنه چیزی شبیه به کد زیر اجرا بشه. یعنی خود sql-server این کار رو انجام بده:

select * from indexes where CONTAINS (*,'billgates AND site:microsoft.com')

AminSobati
یک شنبه 24 مهر 1384, 23:19 عصر
هاشم جان، هیچ نرم افزاری هوشمند نیست مگر اینکه برنامه نویسان اون زحمت فراوانی کشیدن تا بسیار انعطاف پذیر بشه و در نظر ما هوشمند جلوه کنه. معمولا این کارها برنامه نویسی بیشتر و صرف وقت بیشتری میطلبه. من راه حال نرمالی سراغ ندارم متاسفانه..

titbasoft
دوشنبه 25 مهر 1384, 11:15 صبح
فرمایش شما کاملا متین
اما تا حالا بارها و بارها یک کاری رو شروع کردم رفتم جلو وسط کار دیدم ای بابا این رو که خود sql-server به طور خودکار انجام میداده که. مخصوصا توی تفاوت های ansi و tsql که خیلی چنین چیزهایی برام پیش اومده. به همین خاطر خیلی وقتها می دونم که سوالم یه کم غیر منطقیه اما به قول معروف یه شبه ای رو مطرح میکنم که حالا اگر روش بهتری وجود داشت در اطراف اون حداقل بهش برسم.
به هر حال ممنون از راهنمایی تون