SalesforceのSoqlでGroup byする方法 | 俺の夢ってなんだったけorz…  的な

俺の夢ってなんだったけorz…  的な

タダの日記なんだからね!!

Salesforceはリレーショナルデータベースが使えると言っておきながら、
相当不便なデータベースしか持ち合わせていません。

テーブルの結合はできない、今時のデータベースというか。
非正規化して使いましょう的なアレである。


そこで今回のテーマGroup byである。
いやいや何がめずらしいんですか?と。

Salesforceでは、やっとこさSpring10でGroup byが実装されたのです。
待ち望みました。

Group byがなければ何が困るのか。
普通に考えて余計なレコードを沢山取得してプログラムで組合せを排除するということをする必要が
あります。
それよりも強烈なのが、Salesforceのガバナ制限など。
10000レコードしかとってこれないとか、1000レコードしかとってこれないとかあるみたいです。

List cList = [SELECT Grouping(field1),field1 FROM sampleTable
WHERE field2 LIKE 'Acme' group by field1];

Group byの実行はこんな感じだ↑。

Min()やMax()、Count()なども使えるぞ。

List cList = [SELECT Max(field1),field2 FROM sampleTable
WHERE field3 LIKE 'Acme' group by field1];

問題は使い方だ。
使い方が載ってないんだよ。どこにも。

sObject型の使い方が分からない罠。

Stringのリストにしたい場合、
List sList = new List();
for(sObject c:cList){
//フィールド名でアクセス
sList.add(String.valueOf(c.get('field1')));
}

sObject型のgetの戻り値がObject型なのでキャストしてやる必要がある。
多分Stringなら何でも変換可能だろう・・・

かなり悩んだが、Group byが使えて何よりだった。

OracleやMySQLなら5分で完了なのにorz