2 votes

comment utiliser de manière compacte plusieurs ou dans une sélection

Disons que j'ai un tableau

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

q)tbl
a  
---
XXY
XXZ
XZZ
XYZ

Et je veux sélectionner les lignes comme " XX " ou " ZZ "

Existe-t-il un moyen plus compact que d'écrire

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

Idéalement, j'aimerais stocker toutes mes options dans une variable et la transmettre à la fonction select.

J'ai essayé d'utiliser des sélections fonctionnelles, mais cela ne fonctionne que pour un seul ou et uniquement dans le formulaire ci-dessous.

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

Au lieu de fixer l'enrôlement " XX "Dans le cadre de c, pourrais-je créer un tableau ou une liste et l'introduire dans c ?

Merci de votre attention.

5voto

terrylynch Points 3670

L'approche la plus courante est la suivante

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

0voto

Davis.Leong Points 102

Approfondir la réponse de @terrylynch vous pouvez également passer la variable à l'instruction like. Comme l'a mentionné Terry, vous pouvez toujours utiliser un adverbe pour étendre le filtrage ou utiliser un lambda et itérer à travers la variable de la liste en utilisant l'adverbe. Dans ce cas, l'utilisation de / : est la méthode la plus simple.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X