如何使用QSQL SELECT语句筛选字符列中值为空列表的记录?
如何使用QSQL SELECT语句筛选字符列中值为空列表的记录?
我完全懂你现在碰到的麻烦——你用主键ID生成了Sedol列,结果里面混了些空列表(),而且不管是正常字符值还是这些空列表,类型都是10h(也就是kdb+里的symbol类型),试了好几种筛选写法都报长度错误,对吧?
这问题根源在于kdb+里的类型匹配规则:你列里的正常值是单个symbol(比如XYZ789),而()是空的symbol列表,两者长度不匹配(单个symbol长度为1,空列表长度为0),直接用=`比较就会触发长度不兼容的报错。
给你几个实用的解决办法,亲测有效:
方法一:用
null直接判断
在kdb+的规则里,空symbol列表()属于null范畴,你可以直接用null来筛选目标行:select ID, Names from x where null Sedol这个写法最简洁,也最贴合kdb+的特性,应该能直接命中所有Sedol值为
()的记录。方法二:检查元素长度
如果第一种方法没达到预期,你可以通过判断每个元素的长度来筛选——空列表的长度是0,单个symbol的长度是1,所以可以这么写:select ID, Names from x where count each Sedol = 0count each会遍历Sedol列的每一个元素,返回各自的长度,再筛选出长度为0的行就行。方法三:统一长度后匹配字面量
如果你一定要用等于判断,得保证两边的长度一致,用enlist把空列表包装成和列元素同结构的形式:select ID, Names from x where Sedol = enlist `()不过这个方法只适合列里都是单个元素或空列表的场景,通用性不如前两种。
另外补充下你之前尝试的写法为什么不行:
select ... where Sedol = ():直接用空列表匹配,和列里的单个symbol长度不匹配,报错;select ... where Sedol = "()":把空列表当成字符串来匹配,类型不兼容,自然找不到;select ... where type Sedol = 10h:type Sedol返回的是整个列的类型(10h),所以会选中所有行,不是筛选单个元素;select ... where type Sedol = 0h:0h是boolean类型,和列类型完全不沾边,当然没用。
最后给个小建议:以后生成Sedol列的时候,可以把空列表转换成null或者空symbol"",后续筛选会更省心~
备注:内容来源于stack exchange,提问作者mmv456
相关产品推荐
相关产品推荐

