0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Apex入門シリーズ】データ操作編2:SOQL / SOSL

0
Posted at

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 にする)

📚 参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?