PDA

View Full Version : جستجوی سریع



2java2
جمعه 29 شهریور 1392, 03:49 صبح
سلام دوستان من در سطح مبتدی دستورات اس کیو ال رو می دونم
می خواستم ببینم واسه سرچ های سریع
مثلا جدولی که 5 فیلد دار که به ترتیب
ID,FirstName,LastName,Phone,Adress
باشه
اگه بخوایم جستجویی در این جدول داشته باشیم به صورتی که اگر کاربر هر کدوم از فیلد هارو وارد کرد به رکورد مورد نظر نزدیک و نزدیک تر بشه اگه مقداری از داده ی هر فیلد رو هم وارد کرد به داده ی مورد نظر نزدیک بشه !!
می خواستم ببینم که باید برای جستجوی چنین حالتی باید store proc نوشت!!?

من در جاوا چنین کدی رو نوشتم

sql = "select * from Person where";
sql += " FirstName like '%" + isNullString(str[0].trim()) + "%' or LastName like '%" + isNullString(str[1].trim()) + "%' or Phone like '%" + isNullString(str[2].trim()) + "%' or Adress like '%" + isNullString(str[3].trim()) + "%'";
sql += " or FirstName like '%" + isNullString(str[1].trim()) + "%' or LastName like '%" + isNullString(str[2].trim()) + "%' or Phone like '%" + isNullString(str[3].trim()) + "%' or Adress like '%" + isNullString(str[0].trim()) + "%'";
sql += " or FirstName like '%" + isNullString(str[2].trim()) + "%' or LastName like '%" + isNullString(str[3].trim()) + "%' or Phone like '%" + isNullString(str[0].trim()) + "%' or Adress like '%" + isNullString(str[1].trim()) + "%'";
sql += " or FirstName like '%" + isNullString(str[3].trim()) + "%' or LastName like '%" + isNullString(str[0].trim()) + "%' or Phone like '%" + isNullString(str[1].trim()) + "%' or Adress like '%" + isNullString(str[2].trim()) + "%'";


در این کد با نوشتن مقادیر زیاد نمی تونم به رکورد مورد نظر نزدیک بشم
اگر کسی می دونه کمک کنه لطفا من طریقه نوشتن store proc رو نمی دونم

محمد سلیم آبادی
جمعه 29 شهریور 1392, 03:56 صبح
شرط های Where را میتونید داینامیک تولید کنید. یعنی مثلا کاربر برای دو پارامتر (ستون) مقداری تهیه کرد شما اون دو شرط را با AND با هم ترکیب میکنید تا جواب نزدیک تری بدست بیاد. یعنی سطرهای بیشتری فیلتر بشن. و جواب دقیق تر بدست بیاد.

به این مثال توجه کنید:


declare @sql varchar(500) =''

set @sql = 'select * from table where 1=1 '

if @param1 is not null
set @sql += 'and id = ' + @param

if @param2 is not null
set @sql += 'and phone = ''' + @param2 + ''' '

...



بازم جستجو کنید. شالوده کار رو من بهتون معرفی کردم راجب dynamic search مطلب فراوان.

2java2
جمعه 29 شهریور 1392, 17:31 عصر
سلام ممنون از کمکتون من اصلا با storeproc ها کار نکردم اصلا نمی دونم باید چطوری ایجادشون کنم
شما که این راهنمایی رو کردید و گفتید که باید در مورد dynamic search بگردم من یک سرچی هم در گوگل زدم چنین کدی رو دیدم که در واقع یه جورایی همینیه که شما فرمودید ولی من اصلا نمی دونم چطوری باید ازش اسفاده کنم یا متغیر هاش رو چطوری ست کنم اصلا نمی دونم خواهشم می کنم راهنمایم کنید چطوری باید این storeproc رو رو جدولم که فیلداش رو بالا گفته بودم ست کنم
و ایجادش کنم ممنون



CREATE PROCEDURE search_orders_1
@orderid int = NULL,
@fromdate datetime = NULL, -- 3
@todate datetime = NULL, -- 4
@minprice money = NULL, -- 5
@maxprice money = NULL, -- 6
@custid nchar(5) = NULL, -- 7
@custname nvarchar(40) = NULL, -- 8
@city nvarchar(15) = NULL, -- 9
@region nvarchar(15) = NULL, -- 10
@country nvarchar(15) = NULL, -- 11
@prodid int = NULL, -- 12
@prodname nvarchar(40) = NULL, -- 13
@debug bit = 0 AS -- 14
-- 15
DECLARE @sql nvarchar(4000), -- 16
@paramlist nvarchar(4000) -- 17
-- 18
SELECT @sql = -- 19
'SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity, -- 20
c.CustomerID, c.CompanyName, c.Address, c.City, -- 21
c.Region, c.PostalCode, c.Country, c.Phone, -- 22
p.ProductID, p.ProductName, p.UnitsInStock, -- 23
p.UnitsOnOrder -- 24
FROM dbo.Orders o -- 25
JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID -- 26
JOIN dbo.Customers c ON o.CustomerID = c.CustomerID -- 27
JOIN dbo.Products p ON p.ProductID = od.ProductID -- 28
WHERE 1 = 1' -- 29
-- 30
IF @orderid IS NOT NULL -- 31
SELECT @sql = @sql + ' AND o.OrderID = @xorderid' + -- 32
' AND od.OrderID = @xorderid' -- 33
-- 34
IF @fromdate IS NOT NULL -- 35
SELECT @sql = @sql + ' AND o.OrderDate >= @xfromdate' -- 36
-- 37
IF @todate IS NOT NULL -- 38
SELECT @sql = @sql + ' AND o.OrderDate <= @xtodate' -- 39
-- 40
IF @minprice IS NOT NULL -- 41
SELECT @sql = @sql + ' AND od.UnitPrice >= @xminprice' -- 42
-- 43
IF @maxprice IS NOT NULL -- 44
SELECT @sql = @sql + ' AND od.UnitPrice <= @xmaxprice' -- 45
-- 46
IF @custid IS NOT NULL -- 47
SELECT @sql = @sql + ' AND o.CustomerID = @xcustid' + -- 48
' AND c.CustomerID = @xcustid' -- 49
-- 50
IF @custname IS NOT NULL -- 51
SELECT @sql = @sql + ' AND c.CompanyName LIKE @xcustname + ''%''' -- 52
-- 53
IF @city IS NOT NULL -- 54
SELECT @sql = @sql + ' AND c.City = @xcity' -- 55
-- 56
IF @region IS NOT NULL -- 57
SELECT @sql = @sql + ' AND c.Region = @xregion' -- 58
-- 59
IF @country IS NOT NULL -- 60
SELECT @sql = @sql + ' AND c.Country = @xcountry' -- 61
-- 62
IF @prodid IS NOT NULL -- 63
SELECT @sql = @sql + ' AND od.ProductID = @xprodid' + -- 64
' AND p.ProductID = @xprodid' -- 65
-- 66
IF @prodname IS NOT NULL -- 67
SELECT @sql = @sql + ' AND p.ProductName LIKE @xprodname + ''%''' -- 68
-- 69
SELECT @sql = @sql + ' ORDER BY o.OrderID' -- 70
-- 71
IF @debug = 1 -- 72
PRINT @sql -- 73
-- 74
SELECT @paramlist = '@xorderid int, -- 75
@xfromdate datetime, -- 76
@xtodate datetime, -- 77
@xminprice money, -- 78
@xmaxprice money, -- 79
@xcustid nchar(5), -- 80
@xcustname nvarchar(40), -- 81
@xcity nvarchar(15), -- 82
@xregion nvarchar(15), -- 83
@xcountry nvarchar(15), -- 84
@xprodid int, -- 85
@xprodname nvarchar(40)' -- 86
-- 87
EXEC sp_executesql @sql, @paramlist, -- 88
@orderid, @fromdate, @todate, @minprice, -- 89
@maxprice, @custid, @custname, @city, @region, -- 90
@country, @prodid, @prodname

2java2
جمعه 29 شهریور 1392, 17:35 عصر
این کد رو تو جاوا پیاده کردم اما تا چقدر باید این شرط هارو ادامه بدم آیا درسته که من این کار رو تو جاوا کنم یا بهتر اینه که باید storeproc براش ایجاد کنم؟؟؟؟


public ArrayList<Person> test(String s){
ArrayList<Person> persons = new ArrayList<Person>();
String sql = "select * from Person where";
String[] str = s.split(" ");
switch(str.length){
case 1:
sql += " ID = '"+isNullString(str[0].trim())+"' or FirstName like '%" + isNullString(str[0].trim()) + "%' or LastName like '%" + isNullString(str[0].trim()) + "%' or Phone like '%" + isNullString(str[0].trim()) + "%' or Adress like '%" + isNullString(str[0].trim()) + "%'";
da.Connect();
persons = da.Selectll(sql);
da.Disconnect();
break;
case 2:
sql += " FirstName like '%" + isNullString(str[0].trim()) + "%' And LastName like '%" + isNullString(str[1].trim()) + "%'"
+ " or Phone like '%"+ isNullString(str[0].trim()) + "%' And Adress like '%" + isNullString(str[1].trim()) + "%'"
+ " or Phone like '%" + isNullString(str[1].trim()) + "%' And Adress like '%" + isNullString(str[0].trim()) + "%'"
+ " or FirstName like '%" + isNullString(str[1].trim()) + "%' And LastName like '%" + isNullString(str[0].trim()) + "%'"
+ " or FirstName like '%" + isNullString(str[0].trim()) + "%' And Adress like '%" + isNullString(str[1].trim()) + "%'"
+ " or Adress like '%" + isNullString(str[0].trim()) + "%' And FirstName like '%" + isNullString(str[1].trim()) + "%'"
+ " or LastName like '%" + isNullString(str[0].trim()) + "%' And Phone like '%" + isNullString(str[1].trim()) + "%'"
+ " or Phone like '%" + isNullString(str[0].trim()) + "%' And LastName like '%" + isNullString(str[1].trim()) + "%'";
da.Connect();
persons = da.Selectll(sql);
da.Disconnect();
break;
case 3:
sql += " FirstName like '%" + isNullString(str[0].trim()) + "%' and LastName like '%" + isNullString(str[1].trim()) + "%' And Phone like '%" + isNullString(str[2].trim()) + "%'";
da.Connect();
persons = da.Selectll(sql);
da.Disconnect();
break;
case 4:
sql += " FirstName like '%" + isNullString(str[0].trim()) + "%' And LastName like '%" + isNullString(str[1].trim()) + "%' And Phone like '%" + isNullString(str[2].trim()) + "%' And Adress like '%" + isNullString(str[3].trim()) + "%'";
da.Connect();
persons = da.Selectll(sql);
da.Disconnect();
break;
}
return persons;
}

2java2
جمعه 29 شهریور 1392, 18:14 عصر
اینجوری تنظیمش کردم و storeproc رو ایجاد کردم اما چطوری باید ازش استفاده کنم؟؟


CREATE PROCEDURE search_orders_1
@ID nvarchar(20) = NULL,
@FirstName nvarchar(50) = NULL,
@LastName nvarchar(50) = NULL,
@Phone nvarchar(15) = NULL,
@Adress nvarchar(MAX) = NULL,
@debug bit = 0 AS


DECLARE @sql nvarchar(MAX),
@paramlist nvarchar(MAX)

SELECT @sql =
'SELECT ID, FirstName, LastName, Phone, Adress
FROM Person
WHERE 1 = 1'

IF @ID IS NOT NULL
SELECT @sql = @sql + ' AND ID = @xID'

IF @FirstName IS NOT NULL
SELECT @sql = @sql + ' AND FirstName >= @xFirstName'

IF @LastName IS NOT NULL
SELECT @sql = @sql + ' AND LastName <= @xLastName'

IF @Phone IS NOT NULL
SELECT @sql = @sql + ' AND Phone >= @xPhone'

IF @Adress IS NOT NULL
SELECT @sql = @sql + ' AND Adress <= @xAdress'

SELECT @sql = @sql + ' ORDER BY ID'

IF @debug = 1
PRINT @sql

SELECT @paramlist = '@xID nvarchar(20),
@xFirstName nvarchar(50),
@xLastName nvarchar(50),
@xPhone nvarchar(15) ,
@xAdress nvarchar(MAX)'

EXEC sp_executesql @sql, @paramlist,
@ID, @FirstName, @LastName, @Phone,@Adress

محمد سلیم آبادی
جمعه 29 شهریور 1392, 18:30 عصر
با دستور EXE پروسیجر رو اجرا میکنید و هر پارامتری که مد نظرتون بود را مقدار دهی میکنید.
مثلا میخواهید پروسیجر با مقدار دهی به پارامتر ID اجرا بشه:

EXEC search_orders_1 @ID = 120

ضمنا همون جایی که این پروسیجر را قرار داده بود نمونه ای از دستورات اجرا با پارامترهای مختلف را ارائه نداده بود؟

2java2
جمعه 29 شهریور 1392, 18:47 عصر
بله درسته ممنون واقعا
این لینکیه که از اونجا گرفتمش
http://www.sommarskog.se/dyn-search-2005.html#dynintro
فقط من وقتی FirstName رو مقدار می دم خیلی از رکورد های دیگه رو هم میاره مثل 2 یا 3 4 تا اضافه تر چرا اینطوریه؟؟

محمد سلیم آبادی
جمعه 29 شهریور 1392, 18:58 عصر
به کد مربوط به پروسیجری که نوشتین دقت کنید از عملگر بزرگتر مساوی برای firstName استفاده شده. تبدیلش کنید به عملگر = یا از LIKE استفاده کنید.
و همین کار را شرطهای دیگه هم انجام بدین

2java2
جمعه 29 شهریور 1392, 18:58 عصر
فکر می کنم به خاطر علامت های => و ... مساوی گذاشتم درست شد فقط چرا اینطوری شرط گذاشته بود چه کمکی می کنه بزرگتر کوچکتری ؟؟!!

2java2
جمعه 29 شهریور 1392, 19:03 عصر
درسته ممنون
فقط چطوری می تونم فیلد رو در داخل '%%' قرار بدم که هرچی که وارد شد در داخل مقدار اون فیلد بود رو برگردونه؟