Memos About Salesforce

Salesforceにハマってたこと!

SOQLとSOSL ユースケースと違い

こんにちは、管理人の@Salesforce.Zです。

Salesforceの開発で最も使われるクエリが
SOQLでしょう

E.X.

Account[] accList = [SELECT Id, Name FROM Account];

しかし、もう一つクエリがあります。

それがなにでしょうか



目次


はい、それがSOSLです。
今回、この二つのクエリについて
少しずつ解明して行きたいと思います。
間違えたら、ご指導ほどを宜しくです。


SOQLとSOSLの大きい違いは

・SOQL
一度に
1 つの標準またはカスタムオブジェクトしか照会できない

・SOSL
1つの SOSL クエリですべてのオブジェクトを検索できます

もう 1 つの相違点として、

SOSL が単語の一致に基づいて項目を検索する

SOQL はデフォルトで完全一致検索を実行します (ワイルドカードを使用しない場合)。

たとえば、SOSL で「Apple」を検索すると、

項目値が「Apple」や「The Apple is so Big」のレコードが返される

SOQL では項目値が「Apple」のレコードのみが返される



SOQLを使用するケース

SOQL:Salesforce Object Query Language

SOQL は、標準の SQL 言語と似ています、
メインは1つのオブジェクト(テーブル)に対する
参照をすること

しかし、違いもあります。

特に

Account[] accList = [SELECT * FROM Account];

が使えませんよー

SOQLは以下の2種類に分けて使われております。

静的クエリ

E.X.

Account[] accList = [SELECT Id, Name FROM Account];

このようにデータベースへの問い合わせ文書

SELECTのところがそのまま書いて、直接SOQLステートメント

として認識できると私が思っている。

こう書いてもわからないかも。

続けて見て、

動的を見てから、

なんとなく、静的と動的の違いがわかってくると思いますので

このまま、進んでいただけたら、幸いです。

動的クエリ

//まずクエリしたいものを文字列として作成し結合する
String query = 'SELECT Id';
query += ' , Name';
query += ' FROM Account';
query += ' WHERE FlagField = TRUE';
If(something){
    query += ' AND fiedlA = '欲しい条件1'';
}else{
    query += ' AND fiedlA = '欲しい条件2'';
}
//クエリしたい文字列をDatabaseメソッドでSOQLとして発行させる
List<sObject> sobjList = Database.query(query);
if(sobjList != NULL && !sobjList.isEmpty()){
    //なんかの処理
}

SOSLを使用するケース

SOSL:Salesforce Object Search Language

複数のオブジェクト(テーブル)に対する

参照したい時に使われます。

E.X.

FIND {トリガ} IN ALL FIELDS RETURNING Account(Name), Contact(FirstName,LastName,Department)

さらにSOQLのように条件も追加できます。

条件使用E.X.

FIND {トリガ} IN ALL FIELDS RETURNING Account(Name WHERE FlagFieldX = TRUE), Contact(FirstName,LastName,Department)

SOSLもSOQLのように静的と動的に分けて使います。

大体前述のSOQLのようにほぼ一緒ですが

違いがSOQLのクエリ文字列を発行するのは

Database.query()メソッドに対して、

SOSLがsearch.query()メソッドを使って、文字列をSOSL

として発行させるところ

静的SOSL

E.X.

FIND {トリガ} IN ALL FIELDS RETURNING Account(Name WHERE FlagFieldX = TRUE), Contact(FirstName,LastName,Department)

動的SOSL

E.X.

String searchquery='FIND\'Edge*\'IN ALL FIELDS RETURNING Account(id,name),Contact, Lead'; 
List<List<SObject>>searchList=search.query(searchquery);


しかし、

私、これまでのキャリアでは、案件では、

使用した経験がありません!!!
使い方を知っているくらいです。
苦労なんかもありませんので、美味しい技術を共有できかねます。
どなたが経験があり、いいところを教えていただきたいです。