SOQLのNOT LIKE句:詳細解説と活用例
SalesforceのSOQL(Salesforce Object Query Language)は、Salesforceプラットフォームに保存されたデータを検索・取得するための強力なクエリ言語です。SQLに似た構文を持ちながら、Salesforceのデータモデルやセキュリティモデルに特化した機能を提供します。SOQLにおける文字列のパターンマッチングを行うLIKE演算子は、特定の条件を満たすレコードを効率的に検索するために頻繁に使用されます。そして、その反対の働きをするのが、今回焦点を当てるNOT LIKE演算子です。
この記事では、SOQLにおけるNOT LIKE演算子の詳細について解説します。NOT LIKE演算子の基本的な構文、動作、およびさまざまな使用例を通じて、その活用方法を理解し、より高度なSOQLクエリを作成できるようになることを目指します。
1. NOT LIKE演算子の基本
NOT LIKE演算子は、指定された文字列パターンに一致しないレコードを検索するために使用されます。つまり、LIKE演算子が特定のパターンに一致するレコードを抽出するのに対し、NOT LIKE演算子は一致しないレコードを除外します。
1.1. 構文
NOT LIKE演算子の基本的な構文は以下の通りです。
sql
SELECT フィールド名1, フィールド名2, ...
FROM オブジェクト名
WHERE フィールド名 NOT LIKE 'パターン';
- フィールド名1, フィールド名2, …: 取得したいフィールドの名前を指定します。
- オブジェクト名: クエリを実行するオブジェクトの名前を指定します(例:Account、Contact、Opportunity)。
- フィールド名: パターンマッチングを行う対象のフィールドの名前を指定します。通常は文字列型のフィールドです。
- パターン: 検索するパターンを表す文字列を指定します。
%(任意の文字列)と_(任意の1文字)のワイルドカード文字を使用できます。
1.2. ワイルドカード文字
NOT LIKE演算子では、主に以下の2つのワイルドカード文字を使用します。
- % (パーセント): 0文字以上の任意の文字列を表します。
- _ (アンダースコア): 任意の1文字を表します。
これらのワイルドカード文字を組み合わせることで、柔軟なパターンマッチングを行うことができます。
1.3. 大文字・小文字の区別
SOQLでは、デフォルトで大文字と小文字は区別されません。つまり、'example' と 'EXAMPLE' は同じものとして扱われます。大文字と小文字を区別して検索を行う場合は、CASE SENSITIVEキーワードを使用する必要があります。(後述)
2. NOT LIKE演算子の使用例
以下に、NOT LIKE演算子の具体的な使用例をいくつか示します。
2.1. 特定の文字列で始まらないレコードの検索
例えば、AccountオブジェクトのNameフィールドが “Test” で始まらないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name
FROM Account
WHERE Name NOT LIKE 'Test%';
このクエリは、Nameフィールドが “Test” で始まるすべてのレコードを除外し、それ以外のレコードを返します。
2.2. 特定の文字列を含まないレコードの検索
AccountオブジェクトのDescriptionフィールドに “Salesforce” という文字列が含まれていないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name, Description
FROM Account
WHERE Description NOT LIKE '%Salesforce%';
このクエリは、Descriptionフィールドに “Salesforce” が含まれるすべてのレコードを除外し、それ以外のレコードを返します。
2.3. 特定の形式ではないレコードの検索
ContactオブジェクトのEmailフィールドが特定の形式(例:@example.com で終わる)ではないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, FirstName, LastName, Email
FROM Contact
WHERE Email NOT LIKE '%@example.com';
このクエリは、Emailフィールドが “@example.com” で終わるすべてのレコードを除外し、それ以外のレコードを返します。
2.4. 特定の文字数ではないレコードの検索
Product2オブジェクトのProductCodeフィールドが5文字ではないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name, ProductCode
FROM Product2
WHERE ProductCode NOT LIKE '_____';
このクエリは、ProductCodeフィールドがちょうど5文字のレコードを除外し、それ以外のレコードを返します。(アンダースコア _ が5個並んでいることに注意してください。)
2.5. NULL値を考慮したNOT LIKE演算子
NOT LIKE演算子は、NULL値を直接比較することができません。NULL値を考慮する場合は、IS NULLまたはIS NOT NULL演算子と組み合わせる必要があります。
例えば、AccountオブジェクトのDescriptionフィールドがNULLではなく、かつ “Salesforce” という文字列を含まないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name, Description
FROM Account
WHERE Description IS NOT NULL AND Description NOT LIKE '%Salesforce%';
このクエリは、DescriptionフィールドがNULLのレコードと、Descriptionフィールドに “Salesforce” が含まれるレコードの両方を除外し、それ以外のレコードを返します。
2.6. 複数条件の組み合わせ
NOT LIKE演算子を他の条件と組み合わせることで、より複雑な検索を行うことができます。例えば、AccountオブジェクトのNameフィールドが “Test” で始まらず、かつIndustryフィールドが “Technology” ではないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name, Industry
FROM Account
WHERE Name NOT LIKE 'Test%' AND Industry != 'Technology';
このクエリは、Nameフィールドが “Test” で始まるレコードと、Industryフィールドが “Technology” であるレコードの両方を除外し、それ以外のレコードを返します。
2.7. CASE SENSITIVEキーワードによる大文字・小文字の区別
SOQLではデフォルトで大文字と小文字が区別されませんが、CASE SENSITIVEキーワードを使用することで、大文字と小文字を区別したパターンマッチングを行うことができます。
例えば、AccountオブジェクトのNameフィールドが “test” (小文字) で始まらないレコードを検索する場合、以下のクエリを使用します。
sql
SELECT Id, Name
FROM Account
WHERE Name NOT LIKE 'test%' CASE SENSITIVE;
このクエリは、Nameフィールドが “test” (小文字) で始まるレコードを除外し、それ以外のレコードを返します。Nameフィールドが “Test” (大文字) で始まるレコードは、このクエリの結果に含まれます。
3. NOT LIKE演算子のパフォーマンスに関する考慮事項
NOT LIKE演算子は、LIKE演算子と同様に、パフォーマンスに影響を与える可能性があります。特に、大規模なデータセットに対してNOT LIKE演算子を使用する場合、インデックスが適切に設定されていないと、クエリの実行速度が遅くなることがあります。
3.1. インデックスの利用
検索対象のフィールドにインデックスが設定されている場合、データベースはインデックスを使用して、クエリの実行速度を向上させることができます。NOT LIKE演算子を使用する場合は、検索対象のフィールドにインデックスが設定されていることを確認することが重要です。
3.2. リーディングワイルドカードの回避
パターンの先頭にワイルドカード文字 (%) を使用すると、インデックスが利用できなくなる可能性があります。これは、データベースがインデックスを先頭から順に検索するため、パターンの先頭がワイルドカード文字である場合、インデックスを効率的に利用できないためです。
例えば、Name NOT LIKE '%Test' のようなクエリは、Nameフィールドのインデックスを利用できない可能性が高く、パフォーマンスが低下する可能性があります。可能な限り、パターンの先頭にワイルドカード文字を使用しないようにクエリを設計することが推奨されます。
3.3. 複雑なパターンの回避
複雑なパターンを使用すると、データベースがパターンマッチング処理に多くのリソースを消費し、クエリの実行速度が遅くなることがあります。できる限り、シンプルなパターンを使用するようにクエリを設計することが推奨されます。
3.4. 他の演算子との組み合わせ
NOT LIKE演算子を他の演算子と組み合わせる場合、演算子の優先順位に注意する必要があります。複雑な条件を組み合わせる場合は、括弧を使用して演算の順序を明確にすることが推奨されます。
3.5. クエリプランの確認
Salesforce Developer Consoleや、その他のクエリ分析ツールを使用して、クエリの実行プランを確認することができます。クエリプランを確認することで、インデックスが適切に利用されているかどうか、ボトルネックとなっている箇所はどこかなどを把握することができます。
4. NOT LIKE演算子の使用上の注意点
NOT LIKE演算子は、NULL値を直接比較することができません。NULL値を考慮する場合は、IS NULLまたはIS NOT NULL演算子と組み合わせる必要があります。NOT LIKE演算子は、パフォーマンスに影響を与える可能性があります。大規模なデータセットに対してNOT LIKE演算子を使用する場合は、インデックスの利用やパターンの最適化などを検討する必要があります。NOT LIKE演算子は、デフォルトで大文字と小文字を区別しません。大文字と小文字を区別して検索を行う場合は、CASE SENSITIVEキーワードを使用する必要があります。NOT LIKE演算子を使用する際は、SQLインジェクション攻撃に対する脆弱性に注意する必要があります。ユーザーからの入力を直接NOT LIKE演算子のパターンとして使用する場合は、入力値を適切にエスケープする必要があります。
5. NOT LIKE演算子の応用例
5.1. 無効な電話番号の検出
ContactオブジェクトのPhoneフィールドに、有効な電話番号の形式ではないデータが入力されている場合、NOT LIKE演算子を使用して、無効な電話番号を検出することができます。例えば、電話番号が数字とハイフンのみで構成されていないレコードを検索する場合、以下のクエリを使用できます。
sql
SELECT Id, FirstName, LastName, Phone
FROM Contact
WHERE Phone NOT LIKE '([0-9]{3}-[0-9]{3}-[0-9]{4})%';
(注: 上記の正規表現は一例であり、電話番号の形式は国や地域によって異なるため、適切な正規表現を使用する必要があります。)
5.2. 不正なメールアドレスの検出
ContactオブジェクトのEmailフィールドに、有効なメールアドレスの形式ではないデータが入力されている場合、NOT LIKE演算子を使用して、不正なメールアドレスを検出することができます。例えば、メールアドレスに “@” と “.” が含まれていないレコードを検索する場合、以下のクエリを使用できます。
sql
SELECT Id, FirstName, LastName, Email
FROM Contact
WHERE Email NOT LIKE '%@%.%';
(注: 上記のパターンは簡易的なものであり、完全なメールアドレスの検証にはより複雑な正規表現を使用する必要があります。)
5.3. 特定のキーワードを含まないコメントの抽出
CaseオブジェクトのCommentsフィールドに、特定のキーワード(例:クレーム、不満)が含まれていないコメントを抽出する場合、NOT LIKE演算子を使用できます。これにより、特定のネガティブなキーワードが含まれていないコメントを分析し、顧客の満足度を向上させるための施策を検討することができます。
sql
SELECT Id, Comments
FROM Case
WHERE Comments NOT LIKE '%クレーム%' AND Comments NOT LIKE '%不満%';
5.4. 特定のテンプレートを使用していないメールの抽出
カスタムオブジェクトに、送信されたメールの内容が保存されている場合、EmailBodyフィールドに特定のテンプレートを使用していないメールを抽出することができます。例えば、特定のフッターテキストが含まれていないメールを検索することで、テンプレートを使用せずに作成されたメールを特定し、運用ルールが守られているかを確認することができます。
sql
SELECT Id, Subject, EmailBody
FROM CustomEmailObject__c
WHERE EmailBody NOT LIKE '%<フッターテキスト>%' ;
6. まとめ
この記事では、SOQLにおけるNOT LIKE演算子の詳細について解説しました。NOT LIKE演算子は、指定された文字列パターンに一致しないレコードを検索するために使用され、%と_のワイルドカード文字を使用して柔軟なパターンマッチングを行うことができます。
NOT LIKE演算子を使用する際には、NULL値の扱い、パフォーマンスへの影響、大文字・小文字の区別、SQLインジェクション攻撃に対する脆弱性などに注意する必要があります。また、インデックスの利用やパターンの最適化、他の演算子との組み合わせなどを検討することで、より効率的なSOQLクエリを作成することができます。
NOT LIKE演算子を理解し、適切に活用することで、Salesforceプラットフォームに保存されたデータをより詳細に分析し、ビジネス上の意思決定を支援することができます。この記事が、あなたのSOQLスキル向上の一助となれば幸いです。