как компактно использовать несколько или в пределах выбора - PullRequest
0 голосов
/ 16 января 2019

скажи, у меня есть стол

tbl:([]a:`XXY`XXZ`XZZ`XYZ)

q)tbl
a  
---
XXY
XXZ
XZZ
XYZ

И я хочу выбрать такие строки, как " XX " или " ZZ "

Есть ли более компактный способ, чем писать

select from tbl where (a like "*XX*")|(a like "*ZZ*")

В идеале я хотел бы сохранить все мои или опции в переменной, а затем передать их в select.

Я пытался использовать функциональные селекторы, но могу заставить его работать только для одного или только в приведенной ниже форме.

q)c:(like;`a;enlist "*XX*")
::
q)?[tbl;enlist c;0b;()]
a  
---
XXY
XXZ

Вместо установки enlist " XX " в c, могу ли я создать таблицу или список и затем передать это в c?

Спасибо

Ответы [ 2 ]

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

Продолжить на @terrylynch ответ Вы также можете передать переменную в оператор like. Как упомянул Терри, вы всегда можете использовать наречие для расширения сопоставления с образцом или использования лямбда-выражения и перебирать переменную списка, используя наречие. В этом случае, используя /: простой способ

q)tbl:([]a:`XXY`XXZ`XZZ`XYZ)
q)tbl
a
---
XXY
XXZ
XZZ
XYZ
q)pattern:("*XX*";"*ZZ*")
q)select from tbl where any a like/:pattern
a
---
XXY
XXZ
XZZ
q)select from tbl where any {x like y}[a;] each pattern
a
---
XXY
XXZ
XZZ
0 голосов
/ 16 января 2019

Наиболее распространенным подходом будет

q)select from tbl where any a like/:("*XX*";"*ZZ*")
a
---
XXY
XXZ
XZZ
...