【问题标题】:KDB: String comparison with a tableKDB:与表进行字符串比较
【发布时间】:2018-12-03 17:12:45
【问题描述】:

我有一张桌子 bb:

bb:([]key1: 0 1 2 1 7; col1: 1 2 3 4 5; col2: 5 4 3 2 1; col3:("11";"22" ;"33" ;"44"; "55"))

如何对字符串进行关系比较?假设我想获取 col3 小于或等于“33”的记录

select from bb where col3 <= "33"

预期结果:

key1    col1    col2    col3
0       1       5       11
1       2       4       22
2       3       3       33

【问题讨论】:

    标签: kdb


    【解决方案1】:

    如果您希望 col3 保持字符串类型,那么只需在 qsql 查询中临时转换?

    q)select from bb where ("J"$col3) <= 33
    key1 col1 col2 col3
    -------------------
    0    1    5    "11"
    1    2    4    "22"
    2    3    3    "33"
    

    【讨论】:

    • 最佳答案,对于较大的表格,cast 将比 value 更快
    【解决方案2】:

    如果您正在寻找经典的字符串比较,无论字符串是否为数字,我都会提出下一种方法:

    一个。创建行为类似于常见 Java 比较器的方法。当字符串相等时返回0,当第一个字符串小于第二个时返回-1,当第一个大于第二个时返回1

     .utils.compare: {$[x~y;0;$[x~first asc (x;y);-1;1]]};
     .utils.less: {-1=.utils.compare[x;y]};
     .utils.lessOrEq: {0>=.utils.compare[x;y]};
     .utils.greater: {1=.utils.compare[x;y]};
     .utils.greaterOrEq: {0<=.utils.compare[x;y]};
    

    b.在 where 子句中使用它们

    bb:([]key1: 0 1 2 1 7; 
        col1: 1 2 3 4 5; 
        col2: 5 4 3 2 1; 
        col3:("11";"22" ;"33" ;"44"; "55"));
    select from bb where .utils.greaterOrEq["33"]'[col3]
    

    c。如下所示,这适用于任意字符串

    cc:([]key1: 0 1 2 1 7; 
        col1: 1 2 3 4 5; 
        col2: 5 4 3 2 1; 
        col3:("abc" ;"def" ;"tyu"; "55poi"; "gab"));
    select from cc where .utils.greaterOrEq["ffff"]'[col3]
    

    .utils.compare 也可以写成矢量形式,不过我不确定它是否会更节省时间/内存

    .utils.compareVector: {
        ?[x~'y;0;?[x~'first each asc each(enlist each x),'enlist each y;-1;1]]
     };
    

    【讨论】:

      【解决方案3】:

      一种方法是在比较之前评估字符串:

      q)bb:([]key1: 0 1 2 1 7; col1: 1 2 3 4 5; col2: 5 4 3 2 1; col3:("11";"22" ;"33" ;"44"; "55"))
      q)bb
      key1 col1 col2 col3
      -------------------
      0    1    5    "11"
      1    2    4    "22"
      2    3    3    "33"
      1    4    2    "44"
      7    5    1    "55"
      q)
      q)
      q)select from bb where 33>=value each col3
      key1 col1 col2 col3
      -------------------
      0    1    5    "11"
      1    2    4    "22"
      2    3    3    "33"
      

      在这种情况下 value each 将字符串值作为整数返回,然后执行比较

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-06
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多