Salesforce
Salesforce 객체 쿼리 언어 (SOQL)
수색…
통사론
- 계정에서 SELECT ID
- SELECT ID, FROM 계정 이름
- SELECT ID From Account WHERE Name = 'SomeAccountName'
- SELECT ID, 이름, (SELECT ID, FROM 연락처 이름) FROM Account
- SELECT ID, FROM 계정의 ID Id : : apexVariableName
기본 SOQL 쿼리
SELECT Id, Name FROM Account
계정 테이블에서 ID 및 이름 필드를 반환합니다. 필터링이나 정렬이 적용되지 않습니다.
필터링을 사용한 SOQL 쿼리
SELECT Name FROM User WHERE IsActive = true
그러면 모든 활성 사용자의 이름이 반환됩니다.
SELECT Name, Phone FROM Contact WHERE CreatedDate >= 2016-01-01T00:00:00.000Z
2016 년 1 월 1 일 이후에 작성된 주소록이 반환됩니다.
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 애드워즈'및 '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을 구성하는 기능입니다.
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},
...
}
이제 ID를 사용하여 Account 개체를 조회 할 수 있습니다. 또한 고유 한 ID 컬렉션을 원한다면 Map 클래스의 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
5 개의 레코드를 위쪽으로 횡단 할 수 있습니다.
SELECT Account.Owner.Profile.CreatedBy.Name FROM Contact
기본 객체가 사용자 정의 조회 필드 인 경우 필드 이름 인 Primary_Influencer__c의 __c가 예를 들어 __r로 변경됩니다.
SELECT Primary_Influencer__r.Nickname__c FROM Contact
자식 레코드를 가져 오는 SOQL 쿼리
SELECT Id, Name, (SELECT Id, FirstName, LastName FROM Contacts) FROM Account
Apex에서의 SOQL 쿼리
Apex에서 쿼리를 수행하려면 쿼리를 대괄호로 묶습니다. 결과는 목록 또는 단일 개체에 할당 될 수 있습니다.
List<Account> allAccounts = [SELECT Id, Name FROM Account];
Account oldestAccount = [SELECT Id, Name FROM Account ORDER BY CreatedDate LIMIT 1];
Apex 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];
Apex SOQL 쿼리의 잠재적 예외
단일 객체에 할당 할 때 단일 행 이외의 다른 것을 반환하는 쿼리는 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
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에서 데이터베이스 쿼리를 실행할 수 있습니다.
String tableName = 'Account';
String queryString = 'SELECT Id FROM ' + tableName + ' WHERE CreatedDate >= YESTERDAY';
List<SObject> objects = Database.query(queryString);
동적 SOQL 쿼리는 컴파일되지 않기 때문에 스키마 참조가 유효하지 않으므로 가능한 경우 :variable
구문을 사용하여 Apex 변수 보간을 사용하는 것이 좋습니다.