PDA

View Full Version : جستجو با Like



twelve
چهارشنبه 20 آذر 1387, 12:26 عصر
جمله زیر رو در نظر بگیرید :


tutorial time zone and time zone map,about zone time,about arcgis software
این جمله در یکی از فیلدهای جدولی قرار داره که به فرض مثال 10 رکورد داره (البته 10 رکورد در جدول آزمایشی، در جدول حقیقی ممکنه به هزاران رکورد برسه)

حالا فرض کنید کاربر کلمه arcgis رو جستجو میکنه، من اگر این کلمه رو درون یک متغیر مثل Key@ قرار بدم و به Stored Procedure بفرستم و کوئری زیر رو بگیرم ، همه اون 10 تا رکورد رو بر میگردونه و با اینکه کلمه مورد نظر اصلا در اون رکورد ها وجود نداره.


select [field1],[field2] From [table] where [field2] Like '%' + @key + '%'
ولی اگر عبارت جستجو رو نریزم توی متغیر و مثل زیر عمل کنم ، دقیقا همون رکورد مورد نظر رو بر میگردونه


select [field1],[field2] From [table] where [field2] Like '%arcgis%'
مشکل من اینه که نمیخوام از روش دوم استفاده کنم (خطر Injection) ولی دنبال نتیجه ای هستم که روش دوم به من میده. چیکار کنم که با stored procedure به نتیجه مورد نظرم برسم


البته این تاپیک (http://barnamenevis.org/forum/showthread.php?t=16792) و این تاپیک (http://www.barnamenevis.org/forum/showthread.php?t=81577&page=2) هم پیدا کردم، ولی چون قدیمی بودن ترجیح دادم تاپیک جدید بزنم

mannai29
چهارشنبه 20 آذر 1387, 13:46 عصر
مطمئن هستید متغیر Key@ مقدار می گیرد؟

twelve
چهارشنبه 20 آذر 1387, 14:36 عصر
بله مطمئنم، مقدارش همون کلمه ای هست که کاربر جستجو میکنه

raravaice
چهارشنبه 20 آذر 1387, 14:42 عصر
select [field1],[field2] From [table] where [field2] Like '%' + @key + '%'

این درسته :


select [field1],[field2] From [table] where [field2] Like @key

حالا key@ رو از بیرون بهش مقدار بده.

موفق باشید

mannai29
چهارشنبه 20 آذر 1387, 16:40 عصر
این درسته :


کد:
select [field1],[field2] From [table] where [field2] Like @key
حالا key@ رو از بیرون بهش مقدار بده.


اگرچه این هم روش درستی است به شرطی که % هم به ابتدا و انتهای key@ اضافه شود و بعد به SP منتقل شود . اما دلیلی برای نادرست بودن کد twelve وجود ندارد بنابراین باید درست جواب بدهد .
من باز هم به خروجی نهایی ای که با فیلد مقایسه می شود یعنی : '%' + @key + '%' ، شک دارم.
این را اگر می توانید چک کنید . دقت کنید Blank بین اجزا نباشد...

ar.shirazi
چهارشنبه 20 آذر 1387, 16:48 عصر
select [field1],[field2] From [table] where [field2] Like '%' + @key + '%'

این درسته :


select [field1],[field2] From [table] where [field2] Like @key

حالا key@ رو از بیرون بهش مقدار بده.

موفق باشید
دوست گرامی
در این صورت SP با مقدار متغیر @key به شکل یک رشته برخورد میکند و به دنبال رشته هایی میگردد که شبیه به مثلا "%test%" باشند و نه شبیه به '%test%'

اگر به این لینک (http://msdn.microsoft.com/en-us/library/aa933232%28SQL.80%29.aspx) مراجعه کنیم میبینیم که خود مایکروسافت از این روش استفاده کرده است:


USE pubs
GO
CREATE PROCEDURE find_books2 @au_lname varchar(20)
AS
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
AND a.au_lname LIKE @au_lname + '%'

EXEC find_books2 'ring'


در خصوص عبارت

select [field1],[field2] From [table] where [field2] Like '%' + @key + '%'

من این کد را تست کرده ام و مشکلی در آن ندیده ام. احتمالا مشکل از جای دیگری باشد

mannai29
چهارشنبه 20 آذر 1387, 17:17 عصر
در این صورت SP با مقدار متغیر @key به شکل یک رشته برخورد میکند
تا اینجا درست،

و به دنبال رشته هایی میگردد که شبیه به مثلا "%test%" باشند و نه شبیه به '%test%'

رشته با دابل کوتیشن و % به SP ارسال نمی شود مگر اینکه کاربر بخواهد یا اشتباه کند!

اگر به این لینک (http://msdn.microsoft.com/en-us/library/aa933232%28SQL.80%29.aspx) مراجعه کنیم میبینیم که خود مایکروسافت از این روش استفاده کرده است:


کد:
USE pubsGOCREATE PROCEDURE find_books2 @au_lname varchar(20)ASSELECT t.title_id, t.title FROM authors a, titleauthor ta, titles tWHERE a.au_id = ta.au_id AND ta.title_id = t.title_id AND a.au_lname LIKE @au_lname + '%'EXEC find_books2 'ring'

روش مایکروسافت درست است و برآورنده نیاز خودش! چون شما در این کد رشته را از یک طرف می بندید!!

در خصوص عبارت

کد:
select [field1],[field2] From [table] where [field2] Like '%' + @key + '%'
من این کد را تست کرده ام و مشکلی در آن ندیده ام.
من هم.

twelve
چهارشنبه 20 آذر 1387, 17:27 عصر
من این کد را تست کرده ام و مشکلی در آن ندیده ام. احتمالا مشکل از جای دیگری باشد

من هم تست کردم و نتیجه همون شد که در پست اول گفتم ، مقدار دهی رو هم به چند روش انجام دادم، هم از بیرون از SQL هم داخل SP هم تعریف متغیر کمکی و ... ، اما نتایجی که به دست میاد اونی نیست که در پست اول در روش دوم گفتم ، و همش پرت و پلا میشه (:دی)

اگر امکان داره شما روش تست کردنتون رو که به جواب درست منجر میشه بگید!!

mannai29
چهارشنبه 20 آذر 1387, 17:54 عصر
شما هر دو روش


'%' + select [field1],[field2] From [table] where [field2] Like '%' + @key
و
'%select [field1],[field2] From [table] where [field2] Like '%arcgis

را تبدیل به SP کنید .key@ هم ورودی است.
و SP را اجرا کنید .
اگر تفاوتی نداشت یعنی خروجی یکسان و درست گرفتید پس مشکل از ارسال متغیر از برنامه است.یا خود برنامه...
در ضمن ما در پروژه خودمان از هر دو روش استفاده می کنیم و مشکلی نداریم.

ar.shirazi
چهارشنبه 20 آذر 1387, 20:54 عصر
تا اینجا درست،

رشته با دابل کوتیشن و % به SP ارسال نمی شود مگر اینکه کاربر بخواهد یا اشتباه کند!

روش مایکروسافت درست است و برآورنده نیاز خودش! چون شما در این کد رشته را از یک طرف می بندید!!

من هم.

رشته با دابل کوتیشن و % به SP ارسال نمی شود مگر اینکه کاربر بخواهد یا اشتباه کند!

دوست عزیز
منظور من این بود که با پ=ارامتر ارسالی به شکل یک رشته کامالی برخورد میکند که علائم % نیز جزئی از آن هستند



روش مایکروسافت درست است و برآورنده نیاز خودش! چون شما در این کد رشته را از یک طرف می بندید!!

بله، درست است. منظورم این بود که سینتکس جناب twelve (http://www.barnamenevis.org/forum/member.php?u=25822) که در پست اول آوردند اشکالی ندارد.

موفق باشید

twelve
چهارشنبه 20 آذر 1387, 22:02 عصر
من که هر کاری میکنم نمیشه ، خیلی جالبه ، از اول هم مشخص بود روشی که دارم میرم غلط نیست، ولی چرا نتیجه ای که من میگیرم با نتایجی که شما میگیرید فرق داره ؟! من قبل از اینکه تاپیک بزنم تمام راه حل هایی که اینجا گفته شد و راه حل هایی که در اینترنت دیدم رو به کار بستم ولی ....

mannai29
پنج شنبه 21 آذر 1387, 10:06 صبح
میشه از جدولتون به همراه داده ها و SP ای که نوشتین یه Script بزارین.