KDB: сравнение строк с таблицей - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть таблица 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

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Одним из способов будет оценка строк перед сравнением:

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"

в этом случае значение каждое возвращает значения строк в виде целых чисел, а затем выполняет сравнение

0 голосов
/ 04 декабря 2018

Если вы ищете классическое сравнение строк, независимо от того, является ли строка числовой или нет, я бы предложил следующий подход:

a.Создайте методы, которые ведут себя подобно обычным компараторам 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]]
 };
0 голосов
/ 03 декабря 2018

Если вы хотите, чтобы 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"
...