मैं इसके साथ जाऊंगा:
ALTER FUNCTION SearchProjects (
@location NVARCHAR(50),
@purpose NVARCHAR(50),
@type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
AND UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
AND UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
)
GO
यदि आप केवल उन्हीं प्रोजेक्ट्स को वापस करना चाहते हैं जहां सभी मानदंडों को पूरा किया जाता है और इनपुट पैरामीटर में एक खाली स्ट्रिंग को वाइल्डकार्ड के रूप में माना जाता है:
SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
SELECT * FROM dbo.SearchProjects('north','',''); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects('','research',''); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects('','','closed'); -- Returns all records with TypeName containing 'closed'
SELECT * FROM dbo.SearchProjects('north','research',''); -- Returns all records with LocationName containing 'north' and PurposeName containing 'research'
यह आपकी तालिकाओं में फ़ील्ड मानों के लिए इनपुट पैरामीटर मानों की तुलना करते समय किसी भी केस-संवेदनशीलता को भी हटा देता है। मैं अब भी LEFT JOIN
का उपयोग करूंगा INNER JOIN
. के बजाय बस अगर कुछ प्रोजेक्ट रिकॉर्ड में गलत स्थान आईडी, प्रयोजन आईडी या टाइप आईडी मान हो सकते हैं।
अगर आप ऐसे प्रोजेक्ट वापस करना चाहते हैं जहां कोई इनपुट पैरामीटर से मानदंड पूरे किए जाते हैं (और जब कम से कम एक इनपुट पैरामीटर में कोई मान होता है तो खाली इनपुट पैरामीटर को वाइल्डकार्ड के रूप में न मानें), आप AND
को बदल सकते हैं में WHERE
OR
. का खंड s और पास करें NULL
किसी भी इनपुट पैरामीटर के लिए आप इसके लिए कोई मान निर्दिष्ट नहीं करना चाहते:
ALTER FUNCTION SearchProjects (
@location NVARCHAR(50),
@purpose NVARCHAR(50),
@type NVARCHAR(50))
RETURNS TABLE
AS
RETURN
(
SELECT p.ProjectName,
p.Areas,
p.PaymentSystem,
p.ReceivedDate,
p.PropertyClassification,
p.ProjectImage,
l.LocationName,
pur.PurposeName,
t.TypeName
FROM dbo.Projects AS p
LEFT JOIN dbo.Locations AS l ON p.LocationID = l.ID
LEFT JOIN dbo.Purposes pur ON p.PurposeID = pur.ID
LEFT JOIN dbo.[Types] AS t ON p.TypeID = t.ID
WHERE UPPER(ISNULL(l.LocationName,N'')) LIKE N'%' + UPPER(@location) + '%'
OR UPPER(ISNULL(pur.PurposeName,N'')) LIKE N'%' + UPPER(@purpose) + '%'
OR UPPER(ISNULL(t.TypeName,N'')) LIKE N'%' + UPPER(@type) + '%'
)
GO
SELECT * FROM dbo.SearchProjects('','',''); -- Returns all records
SELECT * FROM dbo.SearchProjects('north',NULL,NULL); -- Returns all records with LocationName containing 'north'
SELECT * FROM dbo.SearchProjects(NULL,'research',NULL); -- Returns all records with PurposeName containing 'research'
SELECT * FROM dbo.SearchProjects(NULL,NULL,'closed'); -- Returns all records with TypeName containing 'closed'
SELECT * FROM dbo.SearchProjects('north','research',NULL); -- Returns all records with LocationName containing 'north' or PurposeName containing 'research'
NULL
यहां अवांछित इनपुट पैरामीटर आवश्यक हैं क्योंकि किसी भी इनपुट पैरामीटर में एक खाली स्ट्रिंग के साथ फ़ंक्शन को कॉल करने से सभी रिकॉर्ड वापस आ जाएंगे:
SELECT * FROM dbo.SearchProjects('north','','');
SELECT * FROM dbo.SearchProjects('north','research','');
SELECT * FROM dbo.SearchProjects('north','','closed');