Поиск нескольких строк, используя как - PullRequest
0 голосов
/ 15 мая 2018

Как использовать like для поиска нескольких строк?

q)\l sp.q

q)select from p where city like "lon*"
p | name  color weight city
--| -------------------------
p1| nut   red   12     london
p4| screw red   14     london
p6| cog   red   19     london

Я хочу найти city, начиная с "lon" или "par", /: дает ошибку type.

q)select from p where city like/: ("lon*";"par*")
'type

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Вам необходимо добавить any к предложению where.Прямо сейчас ваше предложение where преобразуется в 2 списка

q)city:`london`london`newyork`paris
q)city like/: ("lon*";"par*")
1100b
0001b
q)any city like/: ("lon*";"par*")
1101b

, так что ...

select from p where any city like/: ("lon*";"par*")
0 голосов
/ 15 мая 2018

Как уже упоминалось, использование any с each-right является лучшим подходом и наиболее разборчивым.

Альтернатива (которая может быть полезна в некоторых сценариях и может быть несколько более эффективной для больших векторов) включает использование встроенной функции регулярного выражения следующим образом:

q)city:`london`london`newyork`paris
q)city like "[lp][oa][nr]*"
1101b

Предостережениев этом случае он также подберет "lan*", "lar*", "por*" и "pan*", но если известно, что эти комбинации невозможны, то это возможно.

0 голосов
/ 15 мая 2018

Вам нужно использовать any при поиске нескольких строк.

q)select from p where any city like/: ("lon*";"par*")

p | name  color weight city
--| -------------------------
p1| nut   red   12     london
p2| bolt  green 17     paris
p4| screw red   14     london
p5| cam   blue  12     paris
p6| cog   red   19     london

При поиске с использованием /: (каждый справа) он возвращает 2 вектора, один против поиска «lon *», а другой - «par *».

(0!p)[`city] like/: ("lon*";"par*")
(100101b;010010b)

с использованием any выполняет ORing и возвращает один вектор.

any (0!p)[`city] like/: ("lon*";"par*")
110111b

Теперь получаем окончательный результат:

(0!p) where any (0!p)[`city] like/: ("lon*";"par*")
p  name  color weight city
----------------------------
p1 nut   red   12     london
p2 bolt  green 17     paris
p4 screw red   14     london
p5 cam   blue  12     paris
p6 cog   red   19     london
...