- リンクを取得
- ×
- メール
- 他のアプリ
LIKEをリストの値に対して使用する方法
SalesforceのSOQLでは、`LIKE`キーワードを使用して文字列の部分一致検索を行うことができます。しかし、`LIKE`は1回のクエリで単一の値に対してしか適用できません。リストに対して`LIKE`検索を行う場合、以下のような工夫が必要です。
1. Dynamic SOQLを使用する
複数の値に対して`LIKE`を適用したい場合は、Dynamic SOQLを構築し、`OR`条件を使用します。以下はその例です。
List<String> searchPatterns = new List<String>{'ABC%', 'DEF%', 'GHI%'}; String baseQuery = 'SELECT Id, Name FROM Account WHERE '; List<String> conditions = new List<String>(); for (String pattern : searchPatterns) { conditions.add('Name LIKE \'' + String.escapeSingleQuotes(pattern) + '\''); } String finalQuery = baseQuery + String.join(conditions, ' OR '); List<Account> accounts = Database.query(finalQuery); // 結果をデバッグ表示 System.debug(accounts);
ポイント:
- `String.escapeSingleQuotes`でSQLインジェクションを防ぎます。
- `String.join`を使用して条件を効率的に結合します。
2. Apexコードでフィルタリング
SOQLで広範囲にデータを取得し、Apexでリストの値を使ってフィルタリングする方法です。
List<String> searchPatterns = new List<String>{'ABC', 'DEF', 'GHI'}; List<Account> allAccounts = [SELECT Id, Name FROM Account]; List<Account> filteredAccounts = new List<Account>(); for (Account acc : allAccounts) { for (String pattern : searchPatterns) { if (acc.Name != null && acc.Name.startsWith(pattern)) { filteredAccounts.add(acc); } } } // 結果をデバッグ表示 System.debug(filteredAccounts);
注意点:
- データ量が多い場合、SOQLクエリの結果制限(50,000行)に注意が必要です。
- クエリ結果をフィルタリングするため、処理効率が低下する場合があります。
3. 正規表現の代替手法
もし一部一致以外の複雑なパターンマッチングが必要であれば、正規表現をApexコード内で利用することも可能です。
List<String> searchPatterns = new List<String>{'ABC.*', 'DEF.*', 'GHI.*'}; List<Account> allAccounts = [SELECT Id, Name FROM Account]; List<Account> filteredAccounts = new List<Account>(); Pattern regex = Pattern.compile(String.join(searchPatterns, '|')); for (Account acc : allAccounts) { if (acc.Name != null && regex.matcher(acc.Name).find()) { filteredAccounts.add(acc); } } // 結果をデバッグ表示 System.debug(filteredAccounts);
ポイント:
- `Pattern`と`Matcher`を使用して文字列を効率的にマッチングします。
選択肢のまとめ
- Dynamic SOQL: パフォーマンスを最大化したい場合に適している。
- Apexフィルタリング: より柔軟なロジックが必要な場合に有効。
- 正規表現: 複雑な一致条件を満たす場合に使用。
コメント
コメントを投稿