在 select 语句上使用匹配运算符

Using the match operator on select statement

在 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"

这会产生一个空结果。

q)select from tab where items ~ "cam"

二进制匹配运算符基本上是比较符号列表与字符列表:

q)`nut`bolt`cam`cog~"cam"
0b

因为 o/p 是 0b,它没有 return 任何记录

select from tab where 0b

如果您仍想使用匹配运算符,以下应该会为您提供正确的结果:

q)select from tab where string[items]~\:"cam"

有关 'match(~)' 和 'like' 工作原理的一些详细信息。也许这会对您的查询有所帮助。

1. Match Function(~): 它比较 2 个对象,returns 如果它们匹配则为真,否则为假。

在你的例子中:

object1 = 项目列表 = `nut`bolt`cam`cog

对象 2 = "cam"

很明显对象 1 与对象 2 不匹配。

如果您想将项目列表中的每个项目与 "cam" 匹配,那么您必须遍历列表。

但是个别项目是一个符号,所以它不会与作为字符串的对象 2 匹配。

   q) `cam ~ "cam" / false

因此您需要将项目转换为字符串或将 "cam" 转换为 `cam。这里有两种方法。

   q) object1: `nut`cam
   q) string[object1] ~\: "cam"  / 01b
   q) object1 ~\: `cam  / 01b

2。 Like Function: 它用于模式匹配,重要的一点是如果左参数是一个列表,那么它会将列表的每个项目与右参数进行比较,而不是像'~'函数那样的完整列表。

也不需要将符号转换为字符串,因为它会在后台自动完成。

   q) items: `nut`cam
   q) items like "cam"  / 01b