在 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
说我有一个 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