SQL

SalesforceのSOQLで注意する3つのこと

salesforce
     
       

業務の一環でSalesforceのSOQLをRe:dashを介して触ることがあったため、ハマりポイントなど記載できたら思っております。SOQLとはsalesforce内で利用できるRDBで他RDB(Postgres、MySQL)とは構文が異なる点について多いです。

別途セールスフォース内にはレポート、ダッシュボードと呼ばれる簡易的な数値可視化機能はついておりますが、だいぶできないことが多いです。簡単なKPIとして往訪件数、活動履歴などを数値するなどは簡単にできますが、データマイニングなどに利用する際はSOQLの利用は必須となってきます。

本記事では具体的な抽出方法から注意点をまとめますのでよろしければ一読いただけますと幸いです。

 

SalesforceのSOQLリファレンス

https://developer.salesforce.comより

まずはSOQLが普通のRDBと違う点を下記に列挙します。

 

SOQLで注意するべき3つのこと

 

*で全カラム抽出が出来ない

通常のRDBでOSSのRDBであればselect * from table_name で簡単に全体のカラム確認を行うことが可能だと思いますがsalesforceはすべてのカラムを記述しないと出力することが出来ません。

しかもカラムの論理名はsalesforceの設定に依存し、salesforceからカラム追加をする時にデフォルトで「Field○○__c」のように○○はインクリメントで勝手に格納され、変更しないと分かりづらくなります。

もちろんそんな草が沢山生えそうな構築はどこもされないと思われますが、、、転職先とかでこういう命名規則にされているsalesforceをみたら本当に笑えないです。かつAPI名はUI上からは変更できないため、再構築は本当に大変だと思います。

そんな時はdataloaderというsalesforceが提供しているローカルソフトウェアがあるため、こちらでカラム名の確認をすることができます。

Dataloader

 

簡単な構文のサンプルを下記に記載します。

・オブジェクト内の全件レコード取得

select Id,Name from Contact 

 

・オブジェクト内の集計

select count(Id) from Contact 

利用できる集計関数は下記リファレンスに記載があります。GROUP BYは普通に利用ができます。

SOQL集計関数一覧

 

・オブジェクト内の条件分岐抽出

select Id,Name from Contact where Name = 'test' 

WHERE句に関しても普通に利用することができます。型は文字列、数値型、論理値、日付型を利用すること可能です。型はsalesforce内で指定した型をそのまま指定することが可能です。また日付型はdateとdatetimeがあり、条件指定する際は注意してください。

比較演算子の構文一覧

 

・オブジェクト内のレコード昇順、降順

select Id,Name,CreatedDate from Contact order by CreatedDate desc

orderに関しても他SQLと同様の内容が利用可能です。またnull値を後ろに持ってくる、最初にもってくるなども指定可能です。

ORDER句構文一覧

 

join全般が使えない

タイトル通り簡単にオブジェクトをjoinしてデータを取得することができません。ただ全くjoinが出来ないわけではありません。salesforce内で定義したER図通り親・子が存在し、そのつながりで取得する方法があります。

親と子の関係についてはカスタムオブジェクトの設定方法に応じて変わってきます。SFA(salesforce Sales Could)の場合は取引先(親)と商談(子)だったり、CRM(salesforce Service Could)の場合はコンタクト(親)とアカウント(子)だったりが標準オブジェクトになっているかと思います。

上記のような親子関係であれば取得が可能です。また乱雑にアカウントを起点として関連していないカスタムオブジェクトをLEFT OUTER JOINして引っ張ってくる等は難しくなってきます。

 

例えばCRMの場合、アカウントとコンタクトを一緒に引っ張る場合は下記のような記述となります。

・アカウント:Contact(子)からAccount(親)を抽出

SELECT Id, Name, Account.Id, Account.Name FROM Contact

上記のように子から親を参照する場合はオブジェクト名を指定してあげると抽出してくることが可能です。

 

・アカウント:Account(親)からContact(子)を抽出

SELECT Id, Name, (SELECT Id FROM Contacts) FROM Account

親から子を取得する場合はサブクエリを書くようなかたちでSELECTとFROMの間にQueryを記述してあげると抽出してくることが出来ます。

 

salesforce内設定に依存する

当たり前ですが、あえて最後に記述します。Salesforceからデータを取得するにはSalesforceの設計にめっちゃ依存します。失礼かもしれないですが、設計が下手なベンダーや担当に設計をさせてしまうことで後々のデータ分析に影響してきます。

また各現場担当が入力する上でもページレイアウトなどが重要になってき、いざ分析を行うフェーズになって多大な時間を要する場合があるため、しっかりSFA、CRMで実現したいことを明確し、方針をしっかりと固めることが大変重要になってきますので、追加改修の場合も新規構築の場合も要件定義前に指針をもって導入してみてください。

 

参照元

 

 

スポンサードリンク