多条件判断套了一层又一层?能简洁点儿吗!| PQ函数实战

2021-08-31 16:11:00 浏览数 (1)

- 1 -

最近工作中碰到个本来比较基础的问题——按多个条件进行判断进行分类。

问题简化后判断逻辑分组如下:

1、男

1.1 码数S,结果为“男小”

1.2 码数M,结果为“男中”

1.3 其它,结果为“男大”

2、女

1.1 码数S,结果为“女小”

1.2 码数M,结果为“女中”

1.3 其它,结果为“女大”

3、男女不明确,结果为“中性定制”

这个问题本身并不复杂,比如可以直接转换为多层嵌套的if语句,轻松得到结果:

完整公式如下:

代码语言:javascript复制
= if [男女]="男"
then if [码数]="S"
      then "男小"
      else if [码数]="M"
           then "男中" 
            else "男大"
 else if [男女]="女"
      then if [码数]="S"
            then "女小"
            else if [码数]="M"
                 then "女中" 
                 else "女大"
       else "中性定制"

不过,看着这一层又一层的if...then...else...,是不是内心在呼唤:能不能换个方式,简洁点儿啊?

- 2 -

办法其实是有的,但如果直接给答案,可能对部分函数不太熟悉的朋友来说理解起来不太容易,我们先进一步简化这个例子,先看看单一条件下怎么处理:

这个问题的基本逻辑很简单:

  • 如果码数为S,则为小码;
  • 如果码数为M,则为中码;
  • 如果码数为L,则为大码;
  • 其它则为“各种加大”

直接用if...then...else...写起来(或者直接操作条件列)也很容易,不过这也套了3层了:

先说一种常见的替代方法,将确定的关系做成一个列表,如:{{"S","小码"},{"M","中码"},{"L","大码"}}。

然后,通过List.Select函数加条件进行筛选取值,对于剩下的取不到的,用try...otherwise...结构进行处理,如下图所以:

这种方法在一定程度上比if...then...else...要结构化一些,但因为要用try...otherwise...进行附加处理,所以也并不是很理想的办法:

  • 一是效率上可能会比较低(一般不建议使用)
  • 二是在增加判断条件时,也会进一步增加嵌套的次数。

那么,是否有某些函数,本身就带了类似的“不符合条件”情况下赋值的功能呢?因为只有这样,我们才能避免如上面“各种大码”的专门处理的层次。

翻了一下M的函数,还真有:Record.FieldOrDefault,这个问题用该函数解决如下:

用这个函数的思路很简单:

  1. 即将明确的条件(码数作为字段名)构建一个记录:[S="小码",M="中码", L="大码"];
  2. 通过Record.FieldOrDefault函数直接根据[码数]对记录进行取值;
  3. 对于取不到记录值的情况,直接赋值(“各种加大”)

- 3 -

有了前面对于Record.FieldOrDefault函数的基础,我们再看文章开始案例的多个条件的情况下怎么用。

1、最外层Record.FieldOrDefault

我们要先对最里层的明确条件构建记录:[男S="男小", 男M="男中", 女S="女小", 女M="女中"],这样,我们就可以通过“[男女]&[码数]”作为记录的字段名直接取到相应的值。

2、嵌套里的Record.FieldOrDefault

对于2个条件不满足的情况(剩余的男女明确的还有:男大、女大,男女不明确的为“中性定制”)用Record.FieldOrDefault函数的第三个参数嵌套进一步处理:即,构建与[男女]相关的记录并读取,读取不到的情况下标记为“中性定制”。

- 4 -

对于多条件判断的问题,在对更多的函数熟悉的基础上,可以根据不同的情况选择不同的方式进行一定程度的简化。

当然,也并不是说,代码越短就越好,或者函数或嵌套层次越少就越好,根据自己的实际情况,快速解决工作中的实际问题即可

配套文件下载:

0 人点赞