zoukankan      html  css  js  c++  java
  • salesforce 零基础学习(三十九) soql函数以及常量

    在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己另外设计。

    一. 聚合函数

    常用的聚合函数有如下几种:

    AVG():求平均值

    COUNT():求记录个数

    COUNT_DISTINCT():求不重复记录个数

    MIN():求记录中最小值

    MAX():求记录中的最大值

    SUM():求和

    这些聚合函数通常和group by fieldName 一起用,达到分组目的。

    下面以Goods__c表进行简单介绍,在Goods表里面新增了四条数据,揭下来通过GoodsBrand对Goods进行分组,求GoodsPrice的总和,平均值,最大值,最小值以及此种GoodsBrand所拥有的条数。

    代码如下所示:

    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,如果内容有错误地方欢迎批评指正,如果有问题欢迎留言。

  • 相关阅读:
    svn command line tag
    MDbg.exe(.NET Framework 命令行调试程序)
    Microsoft Web Deployment Tool
    sql server CI
    VS 2010 One Click Deployment Issue “Application Validation did not succeed. Unable to continue”
    mshtml
    大厂程序员站错队被架空,只拿着五折工资!苟活和离职,如何选择?
    揭秘!Windows 为什么会蓝屏?微软程序员竟说是这个原因...
    喂!千万别忘了这个C语言知识!(~0 == -1 问题)
    Linux 比 Windows 更好,谁反对?我有13个赞成理由
  • 原文地址:https://www.cnblogs.com/zero-zyq/p/5680446.html
Copyright © 2011-2022 走看看