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

Select From Table1 Where id = anything

مغلق
بدأه حسام الملحم في 25 ديسمبر 2005 · 9 رد · 1,238 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم،،

هذه الجملة ترجع لي كل شيء في جدول Table1

SELECT FROM Table1.*

هذه الجملة ترجع لي كل البيانات التي تحمل الاسم Hussam

SELECT FROM Table1.* WHERE name="Hussam";

أريد نفس نتائج الجملة الأولى، لكني أريد في نفس الوقت أن أضع شرطا (عاما) بحيث أستطيع فقط تغيير المتغير في name.

SELECT FROM Table1.* WHERE name=anything;

كيف أشرط أن تكون name أي شيء؟؟

أرجو أن يكون سؤالي مفهوما،،، طبعا أستطيع حذف WHERE لأحصل على ما أريد،، لكني أريد أن أبقيها،،

كيف السبيل إلى ذلك؟

شكرا..

#2

من داخل ال Query Analyzer ستعمل هكذا

Declare @AnyName nvarchar(50)
SELECT * FROM Table1 WHERE [name] = @AnyName

هذا الكود بالشكل العادى و لكن يمكن استخدام اجراء مخزن كما بالكود التالى

Create Procedure SearchByName @AnyName nvarchar(50)
as /**/
SELECT * FROM Table1 WHERE [name] = @AnyName
Go

ولتنفيذه يتم الاستدعاء كما بالشكل

Exec SearchByName 'Tarik'

:D بالمناسبة الموضوع مكرر فى اكثر من مكان

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#3

لا الموضوع ليس مكررا!! ومن الصعب البحث عنه لو كان مكررا!

سأحوال إعادة صياغة ما أريد،،

انظر إلى مثالك بالضبط،، هل لي أن أكتب التالي:

Exec SearchByName anything

وبهذا يرجع لي كل شيء!

لماذا أريد ذلك؟؟

عندي جملة استعلام وظيفتها البحث عن الحسابات التي بالشروط التالية:

SELECT Account.id, Account.balance, Account.customer_id
FROM Account
WHERE (((Account.id)="22") AND ((Account.balance)=14) AND ((Account.customer_id)="2"));

لكني أريد التحكم بهذه المتغيرات، لا أريد فقط تغييرها، ولكني أيضا أريد أن أصنع شرطا إضافيا وهو أن يكون شيء معين يساوي (أي شيء)

SELECT Account.id, Account.balance, Account.customer_id
FROM Account
WHERE (((Account.id)=??????) AND ((Account.balance)=??????) AND ((Account.customer_id)=????????));

بهذا ترجع لي الجملة كل شيء! أي وكأني لا أضع شروطا!! وأعمل بعدها exec!

في برنامجي سأقوم بإرسال الشروط إلى هذه الجملة،، وأعمل ما أريد من استعلامات،، وأريد أن أرسل مثلا شرط أن يكون الرقم id مثلا (لا شرط) أي شيء! فماذا أرسل بالضبط؟

أرجو ألا يكون سؤالي صعبا!

#4

سنفترض انك تود البحث ب 3 معايير اساسية تاخذ قيم مختلفة و معير اخر يمكن ان تضع له قيمة ام لا

الثلاث معايير الاساسية هى ال Account Number و ال Customer ID و ال Account Balance و المعيار الثانوى الذى يمكن ان تضعه ام لا هو ال Customer Name

Create Procedure Search 
@AccountNo int,
@CustomerID int ,
@AccountBalance Money,
/*سنفترض ان معيار البحث الذى يمكن ان تضعه هو الاسم */
@CustName NVARCHAR(50)= Null /*معيار بحث يمكنك ان تضع له قيمة او لا تضع*/
as/**/
SELECT Account.[id], Account.balance,
Account.customer_id ,Account.CustomerName
FROM Account WHERE Account.[id] = @AccountNo and Account.customer_id  = @CustomerID and Account.balance = @AccountBalance and Account.CustomerName = @CustName

Go

و يمكن تنفيذه بهذا الشكل

Exec Search 1009,4589,2000 ,'Dalia'

و بهذا الشكل

Exec Search 2178,3025,5900 ,Null

ستجد ان التنفيذ فى المرة الثانية خذ قيم مختلفة و تجاهلنا استخدام اسم العميل كمعيار

اتمنى ان يكون هذا ما تريد

اقتباس
ومن الصعب البحث عنه لو كان مكررا!

بدون البحث راجع صفحة اهم مواضيع القسم

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#5

..............................

..........

يعطيك العافية أخي طارق،،

لكن سؤالي فقط في جمل SQL وليس في MSSQL،، أقصد SQL القياسية...

بعد البحث وجدت أني أستطيع أن أكتب هذه الجملة لأحصل على ما أريد،، وهو استعمال LIKE وأشير بعلامة النجمة * ،،

SELECT Account.id, Account.balance, Account.customer_id
FROM Account
WHERE (((Account.id) Like "*") AND ((Account.balance) Like "*") AND ((Account.customer_id) Like "*"));

طبعا هذه سترجع لي جميع البيانات،، وإن أردت رقم معين فأستبدل النجمة بهذا الرقم مثل:

SELECT Account.id, Account.balance, Account.customer_id
FROM Account
WHERE (((Account.id) Like "*") AND ((Account.balance) Like "70") AND ((Account.customer_id) Like "*"));

الشرط العام كما ترى هو Like "*"

ربما لم أوضح طلبي جيدا،،

شكرا على المعلومات الإضافية!

#6

كلا اخ ابو مازن انا الذى كتبت الكود باستخدام ال T-SQL ظناً منى انك تريد الحل بال MS SQL Server

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#7

هذا الموضوع تعرضت له منذ فترة, وكنت أضطر لبناء جملة SQL على حسب المتغيرات, مثلا للتوضيح فقط :

if( theVariable !=0 // or not equal null mathalan)
{
mySQLString += "where thevariable = katha"
}

لكن هذه الطريقة سيئة للغاية وتزيد تخلف عندما يصبح هناك أكثر من متغير لأنك ستضطر إلى اضافة كلمة and على حسب شروط معينة. ما أحزنني أن هذه المشكلة شائعة جدا وبالتأكيد يوجد لها حل متفق على جودته. لكني تكاسلت عن البحث عن الحل السليم وقتها, وفجأه تذكرت هذا الموضوع وودت البحث عنه لمعرفة ما وصل اليه. والحقيقة حل الأخ أبو مازن ببساطته يعمل 100% , وأظن أن حل الأخ طارق لن يعمل لأنه يعتمد على null, و null لا تعني Anything, بل تعني null.

فجملة select * from T where C = null سترجع الصفوف عندما تكون فيها C بـ null ولن ترجع كل الصفوف بالطبع.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#8

السلام عليكم

هناك حل استخدمه عادة لحل مثل هذه المشكلة

و هي باضافة عبارة or لجعل الشرط يعمل و يجلب كل السجلات في حالة كانت القيمة المررة فارغة

سوف اوضح اكثر, لاحظ الكود التالي:

create procedure anyname
@id int, @name varchar(20)
as
SELECT Account.id, Account.name
FROM Account
WHERE (Account.id like @id or @id = 0) and (account.name like @name or @name is null)

في حال كانت القيمة الممرة فارغة سوف يتم جلب جميع السجلات اما في حال كانت القيمة الممرة تحتوي على قيمة سوف يتم جلب السجل الذي يحتوي

على القيمة

يمكنك وضع اي قيمة في البارميتر الممرر اذا اردته ان يجلب جميع السجلات

مثلا عندما نوع البيانات رقم صحيح تكون 0 او يمكنك وضعها Null و تعدل فوق الجمل

ارجوا ان تكون الفكرة التي في رأسي قد وصلت

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

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

#9

نعم أخ وائل وصلت الفكرة, هذا رائع جدا. كنت جربت الكود التالي وحل المشكلة :

declare @lastName varchar(39)
if (@lastName is null)
	set @lastName = '%'

Select EmployeeID,LastName from Employees where LastName like @lastName

أظن أن هذا ما كان يفكر فيه الأخ أبو مازن, لأن " * " لا تعمل.

انما سيكون تطبيقه صعب عندما يكون هناك أكثر من متغير, فالكود الذي طرحه الأخ وائل هو الأفضل وجربته وشغال.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

#10

أنا آسف على رفع الموضوع كل شوية :D ولكن أظن أنني عرفت الحل المثالي قدرا !

الحل هو استخدام IsNull, مثلا :

select * from Employees where EmployeeID = IsNull(@myNullableVar,EmployeeID)

لو كان المتغير myNullableVar بـ Null سيتم استرجاع كل الـ Employees, وان كان بقيمة معينه سيتم استرجاع Employee واحد فقط على أساسه.

#Read

http://MoutazShams.blogspot.com

projects003.gif

أعتذر عن التغيب هذه الأيام نظرا للانشغال المريب

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

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