在select语句上使用match运算符

时间:2018-10-24 06:10:54

标签: kdb

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

这将产生空结果。

2 个答案:

答案 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