2013.07.11
SOQLでも使える!集計関数の利用について
SOQLでは、SQLで使用可能な一部の集計関数が使用可能です。(APIバージョン18以上)
今回は、その利用方法及び、注意事項です。
SOQLでも使える!集計関数の利用について
例えば、件数を取得する場合は、以下のような記述を行うと、取得可能です。
public class hogeController{
public Integer recCount {get; set;}
public void recordCountTest(){
AggregateResult a = [select count(Id) cnt from hogeObj__c];
// AggregateResultはMAP型なので↓の様に取得する
recCount = Integer.valueOf(a.get('cnt'));
}
}
特定の項目で集約したい場合など(例:select hoge__c, count(id) cnt from hogeObj__c group by hoge__c)は、
AggregateResult部分をリストで取得することで対応可能となります。
ただし、AggregateResultの内容はString型で返ってくるため、変数に入れる場合は型に注意が必要となります。
(valueOfを使用)
なお、デバッグログを参照すると、countで1件に集約されたとしても、取得件数分Selectカウントされているので、
ガバナ制限を超えた件数を取得する場合には、注意が必要となります。
例:2000件のデータをCOUNT関数で取得した場合
クエリの結果→1レコード(Number of SOQL queries: 1 out of 100)
ガバナ→Number of query rows: 2000 out of 50000
また、注意事項として、
集計関数を使うとLIMIT関数が使えなくなるため、ガバナ制限を超える件数をカウントする必要がある場合は、
forループでSOQLを実行し、ガバナ制限に達する前にソースコード内でbreakする必要があります。
public hogeController2{
public void recordCountTest2(){
Integer recCount = 0;
for(hogeObj__c h : [select id from hogeObj__c]){
recCount++;
if(recCount == 45001){
// ※エラー処理等を記載
break;
}
}
}
}
こうなると、もうCOUNTを使用することができませんので、COUNTの用途は非常に制限された
ものだと感じます。COUNT利用で、ガバナ制限を回避する方法をご存じの方は、是非ご連絡ください。