SalesforceのSoqlでlike句が使えるテキスト項目の種類と、使えない場合の代替方法

Salesforceでは、Like句を使って、selectできるデータタイプが限定されています。

SELECT Id, Name from Lead WHERE qTextAreaRitch__c Like ‘aa%’

みたいなsoql文を使って検索すると、

[object Object]: SELECT Id, Name from Lead WHERE qTextAreaRitch__c Like ‘aa%’ ^ ERROR at Row:1:Column:33 field ‘qTextAreaRitch__c’ can not be filtered in query call

といったエラーが出て、検索結果が返ってきません。

では、どのデータ型が大丈夫で、どれが大丈夫でないかを表にしてみます。

データ型データ型詳細サンプルで作成したカラム名Like句を使用可能か
テキストテキスト(255)qText__c
テキストエリアテキストエリア(255)qTextArea__c
テキストエリア (リッチ)リッチテキストエリア(32768)qTextAreaRitch__c×
ロングテキストエリアロングテキストエリア(32768)qLongText__c×

後ろの3つが日本語で「テキストエリア」となっていて分かりにくいのですが、実際には 最初の2つは文字列型で、項目を作成するときに指定できる文字数が255文字以内となっていて、Like句も使用可能です。 後の2つはテキストエリア型で、256文字以上の文字数しか指定できません。Like句も使用不可能です。

ただ、多くの文字が入力される可能性のある項目にはやはり255文字以上を指定したいですよね。

テキストエリア型でLike句のような振る舞いをさせる方法

String strKey = ‘ccc*’;
List<List<SObject>> arrayOfArray = [FIND :strKey IN ALL FIELDS RETURNING Lead(Id, Name)];
List<Lead> arrayOfAccount = (List<Lead>)arrayOfArray[0];

FIND {ccc*} IN ALL FIELDS RETURNING Lead(Id, Name)

でSOSL文を使います。

グローバル検索と同じ振る舞いになりますので、インデックスが作られるまで検索対象にならなかったり、検索対象のデータ型のすべての項目が対象になるなど、少しクセはありますが、テキストエリアを含めたカラムが対象になるのは便利だと思います。

特定のカラムに検索対象の文字列が含まれているような振る舞いにするには、検索結果のレコード配列をさらにcontainsで見るなどの工夫をすればいいかもしれませんね。

もうひとつの方法は、レコードを取得した後で必要な項目に対して文字列が含まれているかを判断する方法です。

以下のようなapexコードを書けばいいでしょう。

List<lead> leads = new List<lead>();
for(Lead lead : [SELECT Id, Name, qText__c, qTextArea__c, qTextAreaRitch__c, qLongText__c FROM Lead]) {
     
    if(lead.qTextAreaRitch__c != '' && lead.qTextAreaRitch__c != null){
        if(lead.qTextAreaRitch__c.contains('ccc')) {
            leads.add(lead);
            system.debug('★added');
        }
    }
}

nullと、空文字の判定をした後出ないと、null pointerのエラーが出る場合があるので、気をつけましょう。