الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيفية البحث مع احتمال وجود حقول فارغة في جملة where

مغلق
بدأه moonno في 6 أبريل 2007 · 3 رد · 970 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

أنا الأن اقوم بعمل كود للبحث المتقدم وهذا البحث يحتوي على أكثر من حقل يسمح للمستخدم بتعبئتها وليس من الضروري تعبئة جميع الحقول لكي تظهر له كل نتائج البحث حاوية تلك الكلمات التي أدخلها في الحقول التي قام بتعبئتها سؤالي هو أود القيام بعمل جملة SQL بحيث استخدم في الشرط AND للربط بين الحقول ولكن عندما لايدخل المسخدم أي كلمه في أحد الحقول لن تظهر لي أي نتيجة بحكم استخدامي لكلمة AND في الشرط ؟ فكيف تظهر لي النتائج مع العلم بأني لا أود استخدام OR بدلا من AND لأن OR تعرض لي النتائج بدون ربط بمعنى انها تعرض لي جميع النتائج التي تحوي الكلمة المدخلة في الحقل الأول وجميع النتائج المدخلة في الحقل الثاني وهكذا وما أود عمله هو ظهور النتائح الحاويه للكلمات التي يدخلها في الحقول التي قام بتعبئتها معاَ أي أنني لم أشترط في برنامجي تعبئه جميع الحقول

أرجوا منكم المساعدة

#2

أهلين

الحل يكون اما من خلال لغة البرمجة

و إما بعمل نفس الطريقة في اجراء داخل Sql Server

و الطريقة هي بعمل المطلوب " الإستعلام ، الحذف أو التعديل " حسب اختيار المستخدم

عبر بناء SQL Quarry و من ثم تنفيذها بواسطة EXEC

انظر المثال

-- Created By Zayed 6/4/2006
Create Procedure ItemInfoResultInPeriod
	@ItemInfoId Int = Null ,
	@StartDate DateTime = Null , 
	@EndDate DateTime = Null , 
	@Sex Bit = Null 
AS
Begin
	--	No Problem It can be all Null 
	Create Table #ItemInfoResult 
	(
		ItemInfoId Int , 
		Normality TinyInt 
	)
	IF ( @@Error <> 0 ) 
	Begin 
		Print 'Error In Create Temporary Table : Mission Failed' 
		Return @@Error
	End

	-- 	Create Dynamic Query For Insert Analysis
	Declare @Sql Varchar ( 700 ) 
	Set @Sql = ' 
		Insert Into #ItemInfoResult 
		Select 
			I.ItemInfoId , 
			Ad.Normality 
		From
			Analysis A , AnalysisDetail Ad , ItemInfo I , ItemRange Ir 
		Where
			I.ItemInfoId = Ad.ItemInfoId And 
			I.ItemInfoId = Ir.ItemInfoId And 
			Ir.ItemInfoId = Ad.ItemInfoId And 
			A.AnalysisId = Ad.AnalysisId ' 

	--	Continue with Creating the Query 
	-- 	Note : We have to Convert all the Data because it will give us Variable Must Declare
	IF ( @ItemInfoId is Not Null )
		Set @Sql = @Sql + ' And ' + 
			Convert ( VarChar , @ItemInfoId ) + ' = I.ItemInfoId '

	IF ( @Sex Is Not Null ) 
		Set @Sql = @Sql + ' And ' + 
			Convert ( Char , @Sex ) + ' = Ir.Sex ' 

	IF ( @StartDate Is Not Null And @EndDate Is Not Null ) 
		Set @Sql = @Sql + 'And 
			DateDiff ( Day , A.OrderDate , ' +Convert ( VarChar , @StartDate , 103 ) +' ) >= 0 And 
			DateDiff ( Day , A.DeliveryDate , ' +Convert ( VarChar , @EndDate , 103 ) + ' ) <= 0 ' 
	IF ( @StartDate Is Not Null And @EndDate Is Null )
		Set @Sql = @Sql + 'And 
			DateDiff ( Day , A.OrderDate , ' +Convert ( VarChar , @StartDate , 103 ) + ' ) >= 0 '
	IF ( @StartDate Is Null And @EndDate Is Not Null ) 
		Set @Sql = @Sql + 'And 
			DateDiff ( Day , A.DeliveryDate , ' +Convert ( VarChar , @EndDate , 103 ) + ') <= 0 '

	--	Now Exqute the Query 
	Exec ( @Sql ) 
	IF ( @@Error <> 0 ) 
	Begin 
		Print 'Error While Inserting from Analysis : Mission Failed' 
		Return @@Error 
	End

أرجوا في المرة القادمة اختيار عنوان ملائم

سلام

تم تعديل هذه المشاركة بواسطة Desigen في 6 أبريل 2007 في 15:19

#3

هناك طريقة افضل من اضافة شروط و تفحص وجود بيانات في الحقول ويمكن ان تستخدم في هذه الحالة:

مثلا لو كان لدينا حقل في جدول اسمه field1 و نريد عمل بحث او فلترة عليه باستخدام عبارة where

هذا الحقل سوف تمرر قيمته عبرالبارامييتر إلى جملة الاستعلام لدينا و ليكن اسم البارامييتر هو @field1

يمكننا كتابة التالي:

select * from Table1 where (field1 = @field1 or @field1 is null)

لاحظ شيئ الان انك سوف تبني جملة الاستعلام و لن تغيير بها نهائيا

اذا ادخل المستخدم قيمة فارغة فسوف تكون قيمة @field1 مساوية لل Null و بالتالي حسب جملة الاستعلام التي كتبناها سوف يجلب كل النتائج لان احد الشرطين تحقق و هو الشرط الثاني

واذا ادخل المستخدم قيمة فسوف يتم جلب النتائج حسب هذه القيمة و سوف يهمل الشرط الثاني

و يمكن تطبيق هذا الشيئ على كافة الحقول التي تريد البحث عنها ويكن الربط فيما بينها باستخدام and او Or حسب ما تريد مثلا:

select * from Table1 where (field1 = @field1 or @field1 is null) and 
(field2 = @field2 or @field2 is null)

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#4

السلام عليكم ورحمة الله وبركاته :

أما أنا فعندي رأي مختلف ..

أنظر المثال البسيط التالي :

-- إنشاء جدول
Create Table Students(id Int Identity(1,1), name Nvarchar(50))

-- حشر بيانات للمثال
Insert Students(name) Values('أحمد')
Insert Students(name) Values('سمير')
Insert Students(name) Values('تيسير')
Insert Students(name) Values('سامح')
Insert Students(name) Values('عباس')

-- إنشاء إجرائية مخزنة
Create Proc Students_Select
	@name   Nvarchar(50) = Null

AS

Select * From Students
Where 
(
	( Not(@name Is Null) ( name = @name ) )
	Or
	( @name Is Null )
)

/*
	Exec Students_Select
	Exec Students_Select @name = 'أحمد'

*/
GO

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…