在kdb中,我有一个选项卡:
tab:flip `items`sales`prices!(`nut`bolt`cam`cog;6 8 0 3;10 20 15 20)
tab
items sales prices
------------------
nut 6 10
bolt 8 20
cam 0 15
cog 3 20
我知道我可以像这样使用正则表达式模式匹配:
select from tab where items like "cam"
为什么不能以相同的方式使用匹配运算符?:
select from tab where items ~ "cam"
这将产生空结果。
答案 0 :(得分:1)
q)select from tab where items ~ "cam"
二进制匹配运算符基本上是在比较符号列表和字符列表:
q)`nut`bolt`cam`cog~"cam"
0b
由于o / p为0b
,因此它不返回任何记录
select from tab where 0b
如果您仍然想使用match运算符,则以下内容应为您提供正确的结果:
q)select from tab where string[items]~\:"cam"
答案 1 :(得分:1)
有关“ match(〜)”和“ like”如何工作的一些详细信息。也许会对您的查询有所帮助。
1。匹配函数(〜):它比较2个对象,如果匹配则返回true,否则返回false。
在您的示例中:
object1 =商品列表=`nut`bolt`cam`cog
object2 =“ cam”
因此,显然object1与对象2不匹配。
如果要将项目列表中的每个项目都匹配到“ cam”,则必须遍历该列表。
但是单个项目是一个符号,因此它将与对象2(它是字符串)不匹配。
(DT_NUMERIC,18,2)((ABS([Customer Price]) - [Partner Share]) / ABS([Customer Price] == 0 ? 1 : [Customer Price]) * 100)
因此,您需要将项目转换为字符串,或者将“ cam”转换为`cam。这是两种方法。
q) `cam ~ "cam" / false
2。像函数一样:用于模式匹配,重要的一点是,如果左参数是一个列表,则它将列表中的每个项目与右参数进行比较,而不是像'〜'函数之类的完整列表。
也无需将符号转换为字符串,因为它会在后台自动执行。
q) object1: `nut`cam
q) string[object1] ~\: "cam" / 01b
q) object1 ~\: `cam / 01b