Utilisation de Select Where, lorsque la condition nécessite l'utilisation de 'Contain' pour décrire les lignes souhaitées<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Salut, je saisis avec ce simple morceau de requête: je veux, je JSL, sélectionner des lignes contenant plusieurs morceaux de chaînes différents. Par exemple, une colonne a des descripteurs tels que '1. échantillon de sang' '2. échantillon de sang', 1. échantillon de sérum' etc. Je veux écrire dans une expression conditionnelle:
dt >> select where('colonne avec les noms d'échantillons' contient 'sang' ou 'sérum').
En référence au bon vieux SAS j'écrirais simplement :
ensemble de nouvelles de données ;
set oldset;
où(index('colonne','sang')>=1 ou index('colonne','sérum')>=1);
Cours;
Comment faire cela en JSL ?
Cordialement Poul
Re : Utilisation de Sélectionner où, lorsque la condition nécessite l'utilisation de "Contenir" pour décrire les lignes souhaitéesHummm plus de folklore.Il y a des allusions à cette syntaxe dans le guide de script, mais rien d'aussi définitif.Merci MS !
Re : Utilisation de Sélectionner où, lorsque la condition nécessite l'utilisation de "Contenir" pour décrire les lignes souhaitéesLe code ci-dessous est une tentative de résumer ma compréhension de la différence entre Column() et As Column().
//PMroz example table
dt=New Table( "Search Example",
Add Rows( 6 ),
New Column( "Sample Means",
Character,
Set Values(
{"1. blood sample", "2. blood sample", "1. serum sample",
"2. serum sample", "1. cardio sample", "2. cardio sample"}
)
)
);
// Column("X") returns a column reference.
// As Column("X") is equivalent to :X, giving access to the values of Column("X").
// Without an index, :X returns the value of the current row.
//
Row() = 3;
x = As Column( dt, "Sample Means" );
y = dt:Sample Means;
col = Column( dt, "Sample Means" );
Show( x, y, col );
// However, with an index (e.g. :X and Column("X")) both the current row
//and the column reference is bypassed; and both commands yield the same result.
x = dt:Sample Means[1];
y = Column( dt, "Sample Means" )[1];
Show( x, y );
// Hence, the below messages using As Column() Or Column()[] are equivalent.
// The empty square brackets ensures that "Select Where" loops through the value of each row.
//Without them, it would repeatedly look for a string in a column reference which would fail every time.
dt << select where(
Contains( Column( dt, "Sample Means" )[], "blood" ) |
Contains( Column( dt, "Sample Means" )[], "serum" )
);
dt << select where(
Contains( As Column( dt, "Sample Means" ), "blood" ) |
Contains( As Column( dt, "Sample Means" ), "serum" )
);
Re : Utilisation de Sélectionner où, lorsque la condition nécessite l'utilisation de "Contenir" pour décrire les lignes souhaitéesJe pense avoir reçu la syntaxe "en tant que colonne" de ce forum de discussion il y a quelque temps.C'est un peu folklorique - il suffit de dire colonne(dt, "nomcol") n'a pas fonctionné dans ce contexte, mais en utilisant comme colonne travaillé.
Quelqu'un d'autre peut-il expliquer pourquoi comme colonne est nécessaire?
Re : Utilisation de Sélectionner où, lorsque la condition nécessite l'utilisation de "Contenir" pour décrire les lignes souhaitéesSalut, la réponse est correcte et m'aide à faire ce que je voulais. En termes d'apprentissage, pourriez-vous expliquer pourquoi la colonne "comme" est là ? Est-ce parce que 'contient' ne fonctionne que sur les colonnes ? Et la "colonne en tant que" renvoie le bon type de données ?
J'ai un peu de mal à comprendre cela.
Salutations
Poul
Re : Utilisation de Sélectionner où, lorsque la condition nécessite l'utilisation de "Contenir" pour décrire les lignes souhaitéesTu y es presque.Copiez le code suivant dans une fenêtre de script et exécutez-le :
New Table( "Search Example",
Add Rows( 6 ),
New Column( "Sample Means",
Character,
Nominal,
Set Values(
{"1. blood sample", "2. blood sample", "1. serum sample",
"2. serum sample", "1. cardio sample", "2. cardio sample"}
)
)
);
dt = current data table();
dt << select where (contains(as column(dt, "Sample Means"), "blood") |
contains(as column(dt, "Sample Means"), "serum"));