由一个问号引发的原理性理解:PQ表数据读取过程是怎样的?

2022-02-18 16:25:53 浏览数 (1)

前些天,我曾发过一个文章《公式惊现一堆问号,原来都是你们会的!| PQ解惑》,其中提到,用一个问号作为运算符,如:c{0}? ,是Power Query用于简化列表取值的容错方法。

今天,有朋友在从一个表(查询)读取数据(使用步骤公式如:表{0}[Sales Team]),尝试使用问号来进行容错处理时,却得到错误的结果!

为什么呢?

其实,如果仔细理解问号(?)的功能,就不会困惑:问号只是针对从列表中取值的情况具有容错能力,并不是用来处理所有取值错误的情况!局限性其实是很大的!

但是,为什么将从表取数的写法反一反就对了?(将“表{0}[Sales Team]”改为“表[Sales Team]{0}”

真聪明!勇于尝试,精神可嘉!

这里,我们将两个不同的表达式分段看:

  • 先列后行的方式,table[列]{0}:

“table[列]”,得到的是一个列表,然后再通过{0}来提取列表中相应位置的数据,如下图所示:

  • 先行后列的方式,table{0}[列]:

table{0}是一个记录,然后再通过[列名]来定位到该记录的最终取值位置。如下图所示:

这就是Power Query里表、行、列引用及其取值方式的基本原理:先列后行(如“table[列]{3}”)是从列表里取值;而先行后列(如“table{3}[列]”),是从记录里取值。

而问号(?),是对“列表”里取值的容错!所以,前面尝试将“表{0}[Sales Team]”改为“表[Sales Team]{0}”,自然就没问题了!

此外,关于取值时到底应该先列后行,还是先行后列?一般来说,两种写法本身没有太大的差异,但是,的确有人遇到过,先列后行的方式,取值的效率会更高!

0 人点赞