数据类型

数据类型:

在excel中,我们经常使用如="NO."&1得到"NO.1",但是如果在PQ中这么操作,就会发现报错了。这是因为PQ对数据类型非常严格,数字就是数字,文本就是文本,数字和文本不能放一起运算。
在PQ中数据类型比较多,如下:

类型举例
Nullnull
Logicaltrue false
Number0 1 -1 1.5 2.3e-5
Time#time(09,15,00)
Date#date(2017,06,30)
DateTime#datetime(2017,06,30,09,15,00)
DateTimeZone#datetimezone(2017,06,30,09,15,00,09,00)
Duration#duration(0,1,30,0)
Text"hello"
Binary#binary("AQID")
List{1,2,3}
Record[A=1,B=2]
Table#table({"X","Y"},{{0,1},{1,0}})
Function(x)=>x+1
Typetype {number} type table [A=any,B=text]

如果需要对数据类型转换,则需要用到转换函数,如要得到"NO.1",需要= "NO."&Text.From(1)
再比如,日期是2017/6/1,要往后推3天,如果直接+3肯定是错的。因为日期是date类型,3是number类型,不同的类型不能放在一起运算,需要= Date.AddDays(#date(2017,6,1),3)
然而有时候类型不同也是可以运算的,比如= #date(2017,6,1)+#duration(3,0,0,0),等价于前面的公式,虽然一个是date类型,一个是duration类型,但都是属于日期时间类的,所以可以这么做。

关于#:

你可能会问,这个#是什么东西?
在PQ中,某些数据类型、结构、符号等之前需要加#,比如#date,#table,#(lf),#shared等。看到这你可能要晕了,好好的搞这么复杂干嘛?
试想下要表示2017/6/1这个日期,如果不加#,写成= date(2017,6,1),那么PQ会以为date是一个自定义函数,结果找不到这个函数的表达式,就会报错,所以得加上#声明这是一个日期,而不是其他。
另一种情况用于查询、步骤以及列等等的命名,查询名、步骤名和列名不得以数字开头,不能出现特殊符号,比如可以叫"查询1"但是不能叫"1查询",也不能叫"查询1-"。你如果非要这么做,也是可以的,但是必须得加上#,写成#"1查询",声明命名中允许数字开头及特殊符号。

学会查看帮助:

在PQ中输入#shared或函数名可查看帮助说明,见《M语言参考资料》
M中的函数都是*.*的格式,每个单词首字母大写。点之前表示函数类别,点之后表示函数功能,比如Text.CombineTable.Combine,虽然功能都是合并,但是作用的对象类型不一样。
在帮助说明中,给出了该函数说明、参数及案例等,这里需要注意:

function表示该函数,需要两个参数(texts和separator),其中texts为必需参数,类型为list;separator为optional,即可选参数,可以省略,类型为text,nullable代表可以为空值null;最后返回的结果为text。
每一个参数必须严格按照指定类型,否则就会报错。比如= Text.Combine("NO.","1"),而第一参数要求的类型是list,就需要在两个文本外面加一对{}构成list。

12 Replies to “数据类型”

  1. 认真拜读大作,可谓逐字逐句。发现本文倒数第二段的最后一句话,“最后返回的结果为list”,是不是作者笔误?按照我理解,这句话是不是应该为“最后返回的结果为text”?

  2. 施老师,请教一下,为什么在PQ里设置列的数据格式为货币、小数、文本等等之后,再上载到excel形成表之后,
    这几列并没有按PQ里修改好的格式来呈现,而都是“常规”单元格格式呢?

    只有日期格式,我发现在PQ里改好后,输出到excel表里就是ok的日期格式。

    这样岂不是PQ的数据清洗很大程度就没有意义了呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注