kdb表中的模糊查询

时间:2018-08-22 10:02:08

标签: kdb

在下表中创建

    Id   name    class
    1    adcvs    2
    2    adxcg    4
    3    adcbfgf  31
    4    adcbfgr  34
    5    adcbfgy  23
    6    adcbfgo  12

现在我要获取name列包含值adcbfg的所有列。我使用了查询:select from table where name in `adcbfg*,请给我关于查询的问题的建议。谢谢

3 个答案:

答案 0 :(得分:4)

您需要使用like来执行此操作:

创建表格:

table:([]Id:1+til 6;name:`adcvs`adxcg`adcbfgf`adcbfgr`adcbfgy`adcbfgo;class:2 4 31 34 23 12)

Id name    class
----------------
1  adcvs   2    
2  adxcg   4    
3  adcbfgf 31   
4  adcbfgr 34   
5  adcbfgy 23   
6  adcbfgo 12 

然后解析name遵循模式adcbfg的行:

select from table where name like "adcbfg*"

Id name    class
----------------
3  adcbfgf 31   
4  adcbfgr 34   
5  adcbfgy 23   
6  adcbfgo 12   

答案 1 :(得分:2)

由于符号仅是对字符串的引用,因此不能在不先引用它们以获得基础字符串的情况下使用正则表达式函数。这就是使用`adcbfg*无效的原因。

出于同样的原因,在字符串正则表达式和诸如name="adcbfg*"之类的符号之间使用比较运算符将不起作用,因为它们是不同的类型。

JejeBelfort建议的like命令允许您在字符串和符号上都使用正则表达式,就像使用符号一样,它将在应用正则表达式之前先对其进行取消引用。

尽管看起来似乎不仅仅使用字符串要复杂,但由于符号类型是固定宽度的,因此其查找速度比使用宽度可变的字符串要快

有关正则表达式的更多信息,请参见https://code.kx.com/q/cookbook/regex/

答案 2 :(得分:1)

使用like的另一种方法可能是:

table[where(table`name)like"adcbfg*"]

这将使用较少的内存,但需要更长的时间来计算。

此外,可以在KX网站上找到有关like关键字的更多详细信息和示例:

http://code.kx.com/q/ref/strings/#like

http://code.kx.com/q/cookbook/regex/