Salesforce
सेल्सफोर्स ऑब्जेक्ट क्वेरी लैंग्वेज (SOQL)
खोज…
वाक्य - विन्यास
- खाता से आईडी का चयन करें
- सेलेक्ट आईडी, अकाउंट से नाम
- खाता का चयन करें जहां से नाम = 'SomeAccountName'
- सेलेक्ट आईडी, नाम, (सेलेक्ट आईडी, संपर्क से नाम) अकाउंट से
- Id का चयन करें, खाता से नाम जहां Id =: apexVariableName
बेसिक SOQL क्वेरी
SELECT Id, Name FROM Account
यह खाता तालिका से आईडी और नाम फ़ील्ड लौटाएगा। कोई फ़िल्टरिंग या सॉर्टिंग लागू नहीं की जाएगी।
छानने के साथ SOQL क्वेरी
SELECT Name FROM User WHERE IsActive = true
यह सभी सक्रिय उपयोगकर्ताओं का नाम लौटाएगा।
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
यह 1 जनवरी 2016 को या उसके बाद बनाए गए संपर्कों को लौटाएगा।
SELECT Id, Name FROM Account LIMIT 100
यह पहले 100 खातों को एक अनियंत्रित सूची से वापस कर देगा।
SELECT Id, Name, Phone FROM Lead WHERE Phone LIKE '(%) %-%'
यह निर्दिष्ट प्रारूप से मेल खाते फ़ोन नंबर के साथ लीड्स लौटाएगा। "%" एक वाइल्ड कार्ड वर्ण के रूप में कार्य करता है।
LIKE '% %'
का उपयोग करने से भी डेवलपर को CONTAINS( )
फॉर्मूला को दोहराने में सक्षम बनाता है।
SELECT Email FROM Lead WHERE LeadSource LIKE '%Google%'
Google या 'Google AdWords' और 'Google प्राकृतिक खोज' वाले लीड स्रोत के साथ लीड्स लौटाएगा।
आदेश देने के साथ SOQL क्वेरी
SELECT Id, Name FROM User ORDER BY LastName
SELECT Id, Name FROM Contact ORDER BY LastModifiedDate DESC
SELECT Name, Title FROM User ORDER BY Title ASC NULLS FIRST
SELECT Id FROM Contact ORDER BY LastName ASC NULLS LAST, FirstName ASC NULLS FIRST
मानचित्र का निर्माण करने के लिए SOQL का उपयोग करना
एक बहुत ही उपयोगी सुविधा जो कई लोगों को नजरअंदाज करती है, वह SOQL क्वेरी का उपयोग करके मैप बनाने की क्षमता है।
Map<Id, Account> accounts = new Map<Id, Account>([SELECT Id, Name FROM Account]);
System.debug(accounts);
जब आप इस कोड को चलाते हैं, तो accounts
में आपकी खाता वस्तुओं का एक मानचित्र होता है, जिसे Id पर रखा जाता है। डीबग लॉग के लिए आउटपुट इस तरह दिखाई देगा:
11:15:10:025 USER_DEBUG [13]|DEBUG|{
XXXXXXXXXXXXXXXXXX=Account:{Id=XXXXXXXXXXXXXXXXXX, Name=Account 1},
YYYYYYYYYYYYYYYYYY=Account:{Id=YYYYYYYYYYYYYYYYYY, Name=Account 2},
ZZZZZZZZZZZZZZZZZZ=Account:{Id=ZZZZZZZZZZZZZZZZZZ, Name=Account 3},
...
}
अब आप अपने आईडी का उपयोग करके खाता वस्तुओं को देख सकते हैं। इसके अलावा, यदि आप यूनिक आईडी का संग्रह चाहते हैं, तो आप मानचित्र कक्षा के keySet()
फ़ंक्शन को कॉल कर सकते हैं, जैसे:
System.debug(accounts.keySet());
जो डीबग लॉग में कुछ इस तरह दिखता है:
11:23:21:010 USER_DEBUG [15]|DEBUG|{XXXXXXXXXXXXXXXXXX, YYYYYYYYYYYYYYYYYY, ZZZZZZZZZZZZZZZZZZ, ...}
यह बहुत उपयोगी है जब आपको रिकॉर्ड प्राप्त करने और अपने कोड में उन्हें बार-बार एक्सेस करने के लिए क्वेरी करने की आवश्यकता होती है।
SOQL संदर्भ माता-पिता के ऑब्जेक्ट फ़ील्ड के संदर्भ में
जब ऑब्जेक्ट किसी लुकअप या मास्टर-डिटेल रिलेशनशिप से जुड़े होते हैं, तो पेरेंट रिकॉर्ड फ़ील्ड को चाइल्ड रिकॉर्ड या क्वेरी में 'बेस ऑब्जेक्ट' से संदर्भित किया जा सकता है। इसे ऊपर की ओर ट्रैवर्सल के रूप में भी जाना जाता है।
SELECT FirstName, Account.Name, Account.Category__c FROM Contact
पांच रिकॉर्डों को ऊपर की ओर ले जाना संभव है।
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
जब आधार ऑब्जेक्ट एक कस्टम लुकअप फ़ील्ड है, तो फ़ील्ड का नाम Primary_Influencer__c, उदाहरण के लिए, __r में बदल दिया जाएगा।
SELECT Primary_Influencer__r.Nickname__c FROM Contact
SOQL प्रश्न बच्चे के रिकॉर्ड प्राप्त करने के लिए
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
एपेक्स में SOQL प्रश्न
एपेक्स में एक क्वेरी करने के लिए, वर्ग कोष्ठक के साथ क्वेरी को घेरें। परिणाम एक सूची, या एक ही वस्तु को सौंपा जा सकता है।
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
सर्वोच्च SOQL क्वेरी में परिवर्तनीय संदर्भ
किसी क्वेरी में एक चर का संदर्भ देने के लिए, एक चर (:) चर नाम से पहले जोड़ें।
Datetime targetDate = Datetime.now().addDays(-7);
List<Lead> recentLeads = [SELECT Id FROM Lead WHERE CreatedDate > :targetDate];
string targetName = 'Unknown';
List<Contact> incompleteContacts = [SELECT Id FROM Contact WHERE FirstName = :targetName];
शीर्ष SOQL क्वेरी में संभावित अपवाद
किसी एकल ऑब्जेक्ट को असाइन करते समय, एक क्वेरी जो एकल पंक्ति के अलावा कुछ भी लौटाती है, वह QueryException
को फेंक QueryException
।
try {
Account a = [SELECT Id FROM Account WHERE Name = 'Non-existent Account'];
} catch (QueryException e) {
// List has no rows for assignment to SObject
}
try {
Account a = [SELECT Id FROM Account];
} catch (QueryException e) {
// List has more than 1 row for assignment to SObject
}
फ़ील्ड का उपयोग करने का प्रयास जिसे आपने क्वेरी में शामिल नहीं किया था, वह SObjectException
को फेंक SObjectException
Account a = [SELECT Id FROM Account LIMIT 1];
try {
System.debug( a.Name );
} catch (SObjectException e) {
// SObject row was retrieved via SOQL without querying the requested field: Name
}
सेमी-जॉइन का उपयोग करना
उन सभी खातों का चयन करना जिनके अंतर्गत खुले अवसर रिकॉर्ड हैं
SELECT Id, Name FROM Account WHERE AccountId IN
(SELECT Id FROM Opportunity WHERE IsClosed = false)
गतिशील SOQL
आप एक नियमित SOQL अभिव्यक्ति के बजाय एक स्ट्रिंग से डेटाबेस क्वेरी निष्पादित कर सकते हैं:
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
चूंकि डायनेमिक SOQL प्रश्न संकलित नहीं किए जाते हैं, उनके स्कीमा संदर्भों को मान्य नहीं किया जाता है, इसलिए जहां संभव हो :variable
सिंटैक्स का उपयोग करते हुए एपेक्स चर प्रक्षेप का उपयोग करना बेहतर होता है।