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スキル向上の一助となれば幸いです。