Использование оператора соответствия в операторе выбора - PullRequest
0 голосов
/ 24 октября 2018

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

Почему я не могу использовать оператор сопоставления одинаковоway?:

select from tab where items ~ "cam"

Это приводит к пустому результату.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Некоторые подробности о том, как работают «match (~)» и «like».Может быть, это поможет вам с вашим запросом.

1.Функция сопоставления (~): Сравнивает 2 объекта и возвращает true, если они совпадают, в противном случае false.

В вашем примере:

object1 = items list = `nut`bolt`cam`cog

object2 = "cam"

Таким образом, object1 не соответствует объекту 2.

Если вы хотите сопоставить каждый элемент из списка элементов с "cam", тогда выприходится перебирать список.

Но отдельный элемент является символом, поэтому он не будет совпадать с объектом 2, который является строкой.

   q) `cam ~ "cam" / false

Поэтому необходимо преобразовать любой элемент в строку.или «кулачок» к «кулачку».Вот 2 способа сделать это.

   q) object1: `nut`cam
   q) string[object1] ~\: "cam"  / 01b
   q) object1 ~\: `cam  / 01b

2.Подобно функции: Используется для сопоставления с образцом, и важным моментом является то, что если левый аргумент является списком, то он сравнивает каждый элемент списка с правым аргументом вместо полного списка, как функция '~'.

Такженет необходимости конвертировать символы в строку, поскольку это автоматически делает это за сценой.

   q) items: `nut`cam
   q) items like "cam"  / 01b 
0 голосов
/ 24 октября 2018
q)select from tab where items ~ "cam"

Бинарный оператор сопоставления в основном сравнивает список символов и список символов:

q)`nut`bolt`cam`cog~"cam"
0b

, поскольку o / p равно 0b, он не возвращает никакой записи

select from tab where 0b

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

q)select from tab where string[items]~\:"cam"
...