KDB: как искать таблицу со списком - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующая таблица t:

t:([]sym:3#`ibm;time:10:01:01 10:01:04 10:01:08;price:100 101 105;val:("hello";"world";"test"))

Как выполнить следующий запрос:

select from t where val in ("hello"; "test")

, где я ожидаю следующий результат:

sym time        price val
---------------------------
ibm 10:01:01    100   hello
ibm 10:01:08    105   test

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Похоже, что ваш запрос возвращает нужный вам результат.

В качестве альтернативы можно использовать ключевое слово «like».

Когда мы используем предложение where в конце оператора select, в разделе 'where' ожидается одно логическое значение, сообщающее ему, должен ли быть выбран столбец.

Когда мы делаем where val in "hello", он на самом деле возвращает логическое значение для каждого элемента строки , с которой он соответствует (когда он не обернут):

q)val:"hello"
q)val in "hello"
11111b

Поэтому для получения единственного возвращенного логического значения мы используем ключевое слово like

q)val like "hello"
1b

Кроме того, при передаче списка строк предложению where следует использовать наречие «каждый справа», чтобы указывать предложению where работать с каждым экземпляром списка.

q)val like/: ("hello";"test")
10b

Однако мы снова сталкиваемся с несколькими логическими значениями, когда в предложении where ожидается один

Поэтому мы используем ключевое слово any, чтобы возвращать результаты, когда или привет или test .

q)any val like/: ("hello";"test")
1b

И мы видим, это дает требуемые результаты

q)select from t where any val like/: ("hello";"test")
sym time     price val
--------------------------
ibm 10:01:01 100   "hello"
ibm 10:01:08 105   "test"

Надеюсь, это поможет

0 голосов
/ 17 января 2019
 q) select from t where any val like/: ("hello"; "test")

Выход:

sym time        price val
---------------------------
ibm 10:01:01    100   hello
ibm 10:01:08    105   test
...