在 select 中如何紧凑地使用多个或

how compactly use multiple or's within a select

说我有一个 table

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

q)tbl
a  
---
XXY
XXZ
XZZ
XYZ

我想 select 像“XX”或“ZZ”这样的行

有没有比写

更紧凑的方式
select from tbl where (a like "*XX*")|(a like "*ZZ*")

理想情况下,我想将我的所有选项或选项存储在一个变量中,然后将其传递给 select。

我试过使用函数式 selects,但只能让它为单个或仅在下面的形式中工作。

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

不是在 c 中设置 enlist“XX”,我可以创建一个 table 或列表,然后将其传递到 c 中吗?

谢谢

最常见的方法是

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

扩展@terrylynch 的回答 您还可以将变量传递给 like 语句。正如 Terry 所提到的,您始终可以使用副词来扩展模式匹配或使用 lambda 并使用副词遍历列表变量。在这种情况下,使用 /: 最直接的方式

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