1. SOQLとは?
SOQL (Salesforce Object Query Language) は、Salesforce 専用の SQL ライクな問い合わせ言語。Apex コードの中からオブジェクトのレコードを検索するのに使用する。
✅ 基本構文
SELECT フィールド名 FROM オブジェクト名 [WHERE 条件]
//コード例
List<Account> accList = [SELECT Id, Name FROM Account WHERE Industry = 'Technology'];
🔹 バインド変数の使い方
Apex の変数を SOQL に埋め込むときは :変数名 を使う
String targetIndustry = 'Technology';
List<Account> accs = [SELECT Id, Name FROM Account WHERE Industry = :targetIndustry];
🔹 リレーション取得(親子/子親)
- 親への参照
例:Contact(子) から Account(親) を取得する
[SELECT Id, Name, Account.Name FROM Contact];
- 子オブジェクトのサブクエリ
例: Account(親) から関連する Contact (子)を取得する
[SELECT Id, Name, (SELECT Id, LastName FROM Contacts) FROM Account];
⚠️ SOQLの注意点:大量データの扱い
• 通常の [SELECT ...] は一度に全件をメモリに読み込む。
→ データ件数が多い場合、メモリ不足の原因になる。
• SOQL For ループ を使うと、結果をバッチ的に分割して1件ずつ順に処理できる!
→ ガバナ制限(メモリ、CPU)の節約に有効!
✅ ガバナ制限対策(SOQL For ループ)
// ❌ 通常のクエリ(全件を一気に読み込む)
List<Account> accList = [SELECT Id, Name FROM Account];
// ✅ SOQL For ループ(分割して処理)
for (Account acc : [SELECT Id, Name FROM Account]) {
System.debug('Account Name: ' + acc.Name);
}
2. SOSLとは?
SOSL (Salesforce Object Search Language) は、複数のオブジェクトをまたいでキーワード検索ができる Salesforce 専用の検索言語。
🔍 どんなときに使う?
- SOQL:特定オブジェクトを絞り込む検索
- SOSL:どのオブジェクトにデータがあるか分からない場合の横断検索
👉 例えば「名前に 'Smith' が含まれる取引先責任者と取引先を一気に探す」など。
✅ 基本構文
FIND '検索キーワード' IN ALL FIELDS RETURNING オブジェクト(項目1, 項目2,...)
| 項目 | 説明 |
|---|---|
| FIND | 検索したいキーワードを指定 |
| IN ALL FIELDS | どの項目で検索するか(省略可能) |
| RETURNING(必須) | どのオブジェクト・項目を取得するか |
| 結果 |
List<List<sObject>> 型で、オブジェクトごとに順番で格納される |
✅ SOSL のコード例
キーワード「John」で、Contact と Lead を検索する例:
List<List<sObject>> searchList = [FIND 'John*'
IN NAME FIELDS
RETURNING Contact(Id, FirstName, LastName),
Lead(Id, FirstName, LastName)];
List<Contact> contacts = (List<Contact>) searchList[0];
List<Lead> leads = (List<Lead>) searchList[1];
System.debug(contacts);
System.debug(leads);
3. 重要ポイントまとめ
🔹 SOQL
- Salesforce専用の SQL ライクなクエリ
- 親子取得ができる
-
:変数のバインド変数が使える
🔹 SOSL
- 複数オブジェクトを横断してキーワード検索できる
🔹 使い分けのコツ
- SOQL → オブジェクトが分かっているとき
- SOSL → どこにあるか分からないとき
🔹 ガバナ制限対策
- SOQL For ループで分割して処理する
- ループ内で DML を繰り返さない(必ず一括 DML にする)