SalesforceにおけるWebサービスコールアウトのテスト完全ガイド

SOQLでリスト値に対してLIKE検索を実現する方法


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フィルタリング: より柔軟なロジックが必要な場合に有効。
  • 正規表現: 複雑な一致条件を満たす場合に使用。

コメント