天天看點

salesforce 零基礎學習(三十九) soql函數以及常量

在salesforce中,我們做SOQL查詢時,往往需要用到計算式,比如求和,求平均值,或者過濾資料時,往往需要通過時間日期過濾,SOQL已經封裝了很多的函數,可以更加友善我們的sql查詢而不需要自己另外設計。

一. 聚合函數

常用的聚合函數有如下幾種:

AVG():求平均值

COUNT():求記錄個數

COUNT_DISTINCT():求不重複記錄個數

MIN():求記錄中最小值

MAX():求記錄中的最大值

SUM():求和

這些聚合函數通常和group by fieldName 一起用,達到分組目的。

下面以Goods__c表進行簡單介紹,在Goods表裡面新增了四條資料,揭下來通過GoodsBrand對Goods進行分組,求GoodsPrice的總和,平均值,最大值,最小值以及此種GoodsBrand所擁有的條數。

salesforce 零基礎學習(三十九) soql函數以及常量
代碼如下所示:

1 String fetchGoodsAggregate = 'select GoodsBrand__c,SUM(GoodsPrice__c) goodsPriceTotal,AVG(GoodsPrice__c) goodsPriceAvg,COUNT(Id) recordCount,MIN(GoodsPrice__c) goodsPriceMin,MAX(GoodsPrice__c) goodsPriceMax from Goods__c group by GoodsBrand__c';
2 List<AggregateResult> aggregateResults = Database.query(fetchGoodsAggregate);
3 for(AggregateResult result : aggregateResults) {
4     system.debug(JSON.serializePretty(result));
5 }      

結果如下所示:

1 {
 2   "attributes" : {
 3     "type" : "AggregateResult"
 4   },
 5   "GoodsBrand__c" : "華為",
 6   "goodsPriceTotal" : 5000.0,
 7   "goodsPriceAvg" : 2500.0,
 8   "recordCount" : 2,
 9   "goodsPriceMin" : 2000.000000,
10   "goodsPriceMax" : 3000.000000
11 }
12 
13 {
14   "attributes" : {
15     "type" : "AggregateResult"
16   },
17   "GoodsBrand__c" : "小米",
18   "goodsPriceTotal" : 3000.0,
19   "goodsPriceAvg" : 1500.0,
20   "recordCount" : 2,
21   "goodsPriceMin" : 1000.000000,
22   "goodsPriceMax" : 2000.000000
23 }      

上述代碼中,我們看到了一個sObject,他的名稱為AggregateResult,此sObject的作用為擷取計算式查詢的結果資訊,此sObject為read only類型。在上述查詢中,如果需要查到具體的内容,隻需在result.get('相關的别名名稱')即可擷取到值,eg:result.get('goodsPriceTotal')即可獲得目前記錄的商品總價格。

另外需要注意的是:擷取記錄條數的函數有兩種,一種為count(),一種為count(field name)。當使用Database.countQuery(sql statement)情況下sql語句中使用count(),其他情況下建議使用count(field name),此種寫法類似于sql語句中的count(*)。并且如果sql語句中含有group by,則不能使用count()函數。

二. 日期相關處理函數

 在資料查詢中,我們很多時候需要通過日期進行資料過濾。這時,使用soql的函數或者常量操作會更加便捷。主要函數和常量如下:

 CALENDAR_YEAR(field name):傳回字段對應的年,此字段參數類型可以為Datetime類型也可以為Date類型,傳回類型為Number類型。

eg:select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016   -->查詢建立時間為2016年的Account

CALENDAR_QUARTER(field name):傳回字段對應的季度,其中1代表1月1日-3月31日,2代表4月1日到6月30日,3代表7月1日到9月30日 ,4代表10月1日到12月31日。

此字段類型傳回的結果為1-4之間的數字,适用于Datetime或者Date類型。

select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016 and  CALENDAR_QUARTER(CreatedDate) = 2    -->查詢建立時間為2016年第二季度的Account

CALENDAR_MONTH(field name):傳回參數對應的月,取值範圍1--12

DAY_IN_MONTH(field name):傳回參數日期中月份對應的日,比如參數如果是2016-02-25   則值傳回25.

select count(Id) accountCount from Account where DAY_IN_MONTH(CreatedDate) < 20 group by CALENDAR_YEAR(CreatedDate) -->查詢建立的天小于每個月20日的Account,通過年進行分組

DAY_IN_WEEK(field name):傳回參數日期中周對應的日,1代表周日,2代表周一,以此類推,7代表周六。

DAY_IN_YEAR(field name):傳回參數日期中目前日期在一年(365天)中對應的天數,例如如果是2月1日,則傳回32

DAY_ONLY(field name):傳回Datetime類型參數對應的Date類型日期。此方法可以實作Datetime類型到Date類型的轉換,如果在資料表中,一個Datetime類型需要和一個Date類型作比較,便可以使用DAY_ONLY函數将Datetime類型轉換成Date類型。

除了正常的Calendar年月日以外,還有相關的财政年月日,可以自行檢視。

HOUR_IN_DAY(field name):傳回datetime類型參數中小時數,此參數隻能是Datetime類型。

 還有很多常用的函數,詳細看API

三.日期處理常用常量

資料查詢中,有的時候使用常量會減少很多的參數傳遞,比如想要查CreatedDate為本年的資料,如果不适用SOQL自帶的常量,則sql查詢時,便需要apex代碼中傳遞過來目前的年,然後通過CALENDAR_YEAR(CreatedDate)擷取當年的比對,但是如果使用常量,便可以直接CreatedDate = THIS_YEAR搞定問題。

常用常量如下所示:

YESTERDAY: 昨天 select Id from Account where CreatedDate = YESTERDAY   -->查詢建立日期為昨天的Account記錄

TODAY : 今天   

TOMORROW : 明天

NEXT_N_DAYS:n  超過今天第n天     SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_DAYS:2   -->查詢關閉日期超過後天的Opportunity

THIS_WEEK : 本周

THIS_MONTH : 本月

NEXT_N_MONTH:n  超過本月第n月

THIS_QUARTER : 本季度

THIS_YEAR : 本年

總結:此篇隻是列舉部分函數以及常量,如果需要詳細自行參看官方PDF,如果内容有錯誤地方歡迎批評指正,如果有問題歡迎留言。

作者:zero

部落格位址:http://www.cnblogs.com/zero-zyq/

本文歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接

個人下載下傳了一些相關學習的PDF檔案,如果需要下載下傳請通路百度雲 點選此處通路 密碼:jhuy

如果文章的内容對你有幫助,歡迎點贊~

為友善手機端檢視部落格,現正在将部落格遷移至微信公衆号:Salesforce零基礎學習,歡迎各位關注。