蓝调了
周四的傍晚时分,我突然有点码农蓝调的感觉,因为好像无论我怎么整,前面总有无数的奇奇怪怪的问题。这些问题居然没有大路的答案。原因是Excel的SQL已经被阉割到一种没人能说得清的程度了。我就想知道到底Excel里的SQL有什么样的函数,知道有什么函数,知道函数怎用,才能以各种叠加的方式得出我的招数,但问题是人微软自己的手册都没有说清楚到底Excel里的SQL可以怎么个用法?相比之下,Access写清楚了,SQL Server也写清楚了,不同版本的函数不一样,些高版本能轻而易举函数就能实现的功能旧版本也有替代方法。但是Excel里的SQL像一个谜一样。你得不断尝试直到绝望。因为你拿着那个问题去搜索,没有结果,结果都是其它数据库的,虽然都叫做SQL,但差别真的很大。
的确用VBA+ADO+SQL搭配能解决一些小数据的问题,而且速度很快,但为什么微软在这个基础上还要继续整出 Power Query和Power Pivot,因为他们知道在操控数据方面,VBA本身真的有很多限制。当我死磕了一周以后,我发现VBA要死要活折腾半天出来的东西如果在PP里两下就搞定了,而且那还是在可视化的情况之下。至于PP,那是不允许你用不可行的方式去操控的,所以虽然三个都在考验逻辑,但是在Excel的SQL里面,我觉得对我最大的考验是,我明明知道要那么干,我明明知道用其它工具应该怎么干,但是无论如何我在这个Excel VBA里面就干不出来。
我遇到的某些问题,跟SQL没有关系,纯粹是VBA数组的问题。VBA的一元数组,如果要输出的话,它会在一行里输出,但如果你要把这个一维数组在列里面输出,你就得做个转置。我遇到的问题是,即便我已经设定了转制。系统依然说我的类型错误,最后我是怎么干的呢?明明我那个是一维数组就可以实现了,但为了可以顺畅输出,我硬是把那个东西设置为了二维数组,另外一维完全是空的。这样的话在我输出到单元格的时候只给予一列的空间也就是那空的第二维根本不用管他。经过SQL处理生成的记录集,如果要输出到数组,通常是一个二维数组,那个二维数组跟VBA自己的数组又是转置的关系的,那个记录集的数组编码是从0开始的,VBA默认的数组是从1开始的。如果在VBA里把一个字符串打断赋值给数组那又是从0开始的。在python里,默认就是从0开始,什么东西都从0开始了,所以你不需要为长度跟起始数值还有突然间又有个转置之类烦恼。
周四我遇到一个算是逻辑意外的事件。我要筛选某个表里某一字段不包含某个关键词的记录,但问题是那个字段里的东西有关键词也有空,我需要筛选出来的记录是关键词以外的其它字符以及空的。当我where 字段A not like ‘%关键词%’的时候,结果出乎我的意料。因为那个关键词是包含的关系,所以我没有办法精确控制,所以我必须在关键词的前后加上%。这句筛选的结果是字段里所有那个字段的记录都没有被筛选出来。不就是一个包含的关系吗?Excel的SQL里面允许用正则吗?最终我用的方式是在where里面用两句话,一个是not like,筛选到那个字段里没有关键词,但是有其它字符的记录,另外一个是用or的关系搭配一个isnull(字段A),这到底是什么情况呢?如果在其他地方,一个contain之类的东西就能表达出来,如果允许用正着,正则也能很好表示不包含关键词,Excel的SQL到底允许我用什么工具呢?
SQL in Excel这把刀到底应该怎么玩???