PDA

View Full Version : ساخت sp برای جستجو در رشته هایی که با ، از هم جدا شدن



smt_414
پنج شنبه 19 مهر 1386, 14:45 عصر
سلام
به همه دوستان
ساخت sp برای جستجو در رشته هایی که با ، از هم جدا شدن
من داخل دیتا بیس فیلدی دارم که حاوی رشته هایی هست که حاوی تعدادی اسمه(مثلا)
به این صورت
(1) علی،جواد،حسن،اکبر
حالا می خوام پارامتری رو برای جستجو از این رشته بفرستم
مثلا
رضا،صادق،اکبر،حسام

الان باید داخل جوابهایی که بر می گردونه رشته (1) هم باشه

تذکر : اسامی با(،)از هم جدا شدن

ممنون می شم اگه راهنمایی کنید.:خجالت:

smt_414
جمعه 20 مهر 1386, 11:14 صبح
سلام به همه دوستان
پیشا پیش عید مبارک
کسی می تونه راهنمایی کنه؟؟

smt_414
جمعه 20 مهر 1386, 18:48 عصر
سلام
کس نمی دونه؟؟:ناراحت:

AminSobati
جمعه 20 مهر 1386, 20:17 عصر
دوست عزیزم،
این نیاز شما میتونه راه حلهای خیلی خوب و خیلی بد داشته باشه. یک راه حل بد اینه که رشته مورد نظر رو بواسطه کاما تفکیک کنین (مثلا توسط تابع CHARINDEX و SUBSTRING و ...) و یک Query داینامیک بسازید که با OR مقایسه رو انجام بده:


SELECT * FROM MyTable
WHERE Col1 LIKE N'%حسن%' OR Col1 LIKE N'%اکبر%'


راه حل خیلی خوب اینه که برای ذخیره این کلمات، اونها رو بصورت رکوردهای متعدد (هر کلمه، یک رکورد) Insert کرده باشید و از کاما و الحاقشون صرف نظر کنین. حالا وقتی یک عبارت متشکل از چند کلمه برای جستجو دارین، باز تفکیک انجام بدین و در یک جدول موقتی وارد کنین. حالا میشه از منطق Join استفاده کرد که سرعت ایده آلی هم داره. لینکهای زیر تشریح کامل رو داره:


http://www.sommarskog.se/arrays-in-sql-2000.html
http://www.sommarskog.se/arrays-in-sql-2005.html

smt_414
شنبه 21 مهر 1386, 09:49 صبح
سلام
جناب ثباتی من سوالم رو کلی مطرح کردم و شما هم جواب کلی دادید
که البته این سبک جواب دادن ، خیلی به کاره دوستان حرفه ای میاد اما من تازه کارم
اگه اجازه بدید سوالم رو بشکنم به چند سوال
گفتید از substring استفاده کنم
نحوه استفاده از اون رو دیدم
اما می خواستم بدونم چه شکلی میشه اونجور که به کاره من بیاد ازش استفاده کنم؟
مورد بعد اینکه امکان تعریف فیلد اختصاصی برای هر مورد وجود نداره ، آخه یه تعدادش از چک لیست باکسه و یه تعداد از تکست باکس
مورد بعد ، بعد از اینکه اسامی رو از رشته ذخیره شده در فیلد استخراج کردم اونا رو تو یه تیبل موقت بریزم و بعد جستجو کنم؟
و اما مورد بعدی رشته ای رو که برای جستجو می فرستم رو همین بلایی که سره فیلد آوردم ، سره این هم بیارم؟
:بوس:

smt_414
یک شنبه 22 مهر 1386, 12:36 عصر
سلام
از دوستان عذر می خوام
اما مورد حیاتی که اصرار بر حلش دارم
جناب ثباتی ،دوستان کسی می تونه راهنمایی کنه؟؟:افسرده:
تشکر

smt_414
چهارشنبه 25 مهر 1386, 14:50 عصر
سلام دوستان
واقعا احتیاج به جواب این سوال دارم
:گریه:

AminSobati
پنج شنبه 26 مهر 1386, 13:13 عصر
روشی که با OR مثال زدم فکر میکنم با توجه به عدم امکان تغییر ساختار دیتابیس، مناسب باشه. برای Parse کردن رشته و تفکیک لغات، در لینکهایی که گذاشتم مثالش وجود داره:


CREATE FUNCTION iter_charlist_to_table
(@list ntext,
@delimiter nchar(1) = N',')
RETURNS @tbl TABLE (listpos int IDENTITY(1, 1) NOT NULL,
str varchar(4000),
nstr nvarchar(2000)) AS

BEGIN
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@tmpstr nvarchar(4000),
@leftover nvarchar(4000),
@tmpval nvarchar(4000)

SET @textpos = 1
SET @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SET @chunklen = 4000 - datalength(@leftover) / 2
SET @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
SET @textpos = @textpos + @chunklen

SET @pos = charindex(@delimiter, @tmpstr)

WHILE @pos > 0
BEGIN
SET @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
INSERT @tbl (str, nstr) VALUES(@tmpval, @tmpval)
SET @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SET @pos = charindex(@delimiter, @tmpstr)
END

SET @leftover = @tmpstr
END

INSERT @tbl(str, nstr) VALUES (ltrim(rtrim(@leftover)), ltrim(rtrim(@leftover)))
RETURN
END

و برای استفاده از این تابع:


SELECT * FROM iter_charlist_to_table(N'نیما,پدارم,کی ان',',')