[Salesforce] Apex Basics & Database - SOQL 쿼리 작성하기



SOQL 쿼리 작성하기

https://trailhead.salesforce.com/ko/content/learn/modules/apex_database/


SOQL(Salesforce Object Query Language)

  • 표준 SQL 언어와 유사하지만 Salesforce 플랫폼에 맞게 사용자 정의됨
  • SOQL 쿼리를 Apex 코드에 포함시켜 간편하게 결과를 조회 (인라인 SOQL)
  • [] 안에 SOQL 구문 작성, return은 sObjects
    Account[] accts = [SELECT Name,Phone FROM Account];
    


Query Editor

  • 이렇게 실행하면 됨~


다른 SQL과의 차이

  • 모든 필드 조회하려면 *이 아닌 FIELDS(STANDARD), FIELDS(CUSTOM), FIELDS(ALL) 사용해야함
  • ID 필드는 항상 반환되기 때문에 생략 가능 (ID만 조회할 땐 명시 필요)
  • 문자열 비교 시 대소문자 구분하지 않음




실습

바인딩

String targetDepartment = 'Wingo';
Contact[] techContacts = [SELECT FirstName,LastName
                          FROM Contact WHERE Department=:targetDepartment];


관련 레코드 조회

  • Salesforce 레코드는 lookup 관계 또는 master-detail 관계로 이어짐
    • Contact는 Account와 lookup 관계
      SELECT Name, (SELECT LastName FROM Contacts) FROM Account WHERE Name = 'SFDC Computing'
      
      Account[] acctsWithContacts = [SELECT Name, (SELECT FirstName,LastName FROM Contacts)
                                 FROM Account
                                 WHERE Name = 'SFDC Computing'];
      // Get child records
      Contact[] cts = acctsWithContacts[0].Contacts;
      System.debug('Name of first associated contact: '
               + cts[0].FirstName + ', ' + cts[0].LastName);
      

  • Contacts 라는 sObjects 가져온걸로 첫번째 데이터 조회한 결과


Contact[] cts = [SELECT Account.Name FROM Contact
                 WHERE FirstName = 'Carol' AND LastName='Ruiz'];
Contact carol = cts[0];
String acctName = carol.Account.Name;
System.debug('Carol\'s account name is ' + acctName);
  • Account.Name 과 같이 .을 사용해서 자식객체에서 부모객체 가져올 수 있음


루프를 통해 일괄 처리 하기

for (variable : [soql_query]) {
        code_block
}
        
for (variable_list : [soql_query]) {
        code_block
}
  • 루프는 sObject 200개마다 한번씩 배치 수행




Hands-on

  • input : Last Name, Mailing Postal Code
  • output : Contact List
  • input 비교해서 매칭되는 contact 1건 조회
public class ContactSearch {
    public static Contact[] searchForContacts(String lastName, String postalCode) {
        Contact[] contacts = [SELECT Name FROM Contact
                   WHERE (LastName=:lastName AND MailingPostalCode=:postalCode)
                   LIMIT 1];
        
        System.debug(contacts);
        
        return contacts;
    }
}

다른 글