SELECT (Begin a Select Group)
| Free-Form Syntax | SELECT {expression} |
| Código | Tipo Datos | Factor 2 Ampliado | ||||
|---|---|---|---|---|---|---|
| SELECT | Blanco | {expression} | ||||
El grupo de selección procesa condicionalmente una de varias secuencias alternativas de operaciones.
Hay dos formularios para el grupo de selección.
- Para el primer formato, la sentencia SELECT no tiene un operando. El grupo de selección consta de:
- Una sentencia SELECT
- Cero o más WHENxx o Grupos de WHEN
- Un grupo opcional de OTHER
- Sentencia ENDSL o END .
- Para el segundo formato, la sentencia SELECT tiene un operando. El grupo de selección consta de:
- Una sentencia SELECT con un operando
- Cero o más grupos de WHEN-IN o WHEN-IS
- Un grupo opcional de OTHER
- Sentencia ENDSL o END .
Nota:- La expresión especificada como operando para SELECT puede tener cualquier tipo de datos. No puede ser un nombre de estructura de datos, un nombre de matriz o una constante figurativa.
- El valor del operando para la sentencia SELECT en el momento de la sentencia SELECT se utiliza para todas las comparaciones para las sentencias WHEN-IN y WHEN-IS en el grupo de selección. Si el valor de la expresión para la sentencia SELECT cambia durante una de las comparaciones para las sentencias WHEN-IN y WHEN-IS , el valor cambiado no se utiliza para las sentencias WHEN-IN y WHEN-IS posteriores. El valor original se utiliza para todas las comparaciones WHEN-IN y WHEN-IS .
Después de la sentencia SELECT , el control pasa a la sentencia que sigue a la primera condición WHEN* que se cumple. A continuación, todas las sentencias se ejecutan hasta la siguiente sentencia WHEN* . El control pasa a la sentencia ENDSL (sólo se ejecuta un bloque WHEN* ). Si no se cumple ninguna condición WHEN* y se especifica una sentencia OTHER , el control pasa a la sentencia que sigue a las operaciones OTHER . Si no se cumple ninguna condición WHEN* y no se especifica ninguna operación OTHER , el control se transfiere a la sentencia que sigue a la operación ENDSL del grupo de selección.
Los indicadores de condicionamiento se pueden utilizar en la operación de SELECT . Si no se satisfacen, el control pasa inmediatamente a la sentencia que sigue a la operación ENDSL del grupo de selección. Los indicadores de condicionamiento no se pueden utilizar individualmente en las operaciones WHEN*, OTHER y ENDSL .
El grupo de selección se puede especificar en cualquier lugar de los cálculos. Se puede anidar en IF, DOu otros grupos de selección. Los grupos IF y DO se pueden anidar dentro de grupos seleccionados.
Si la comparación en más de una sentencia WHEN* es verdadera, el control pasa a las sentencias asociadas con la primera sentencia WHEN* verdadera.
Si se especifica una operación SELECT dentro de un grupo de selección, las operaciones WHEN* y OTHER se aplican al nuevo grupo de selección hasta que se especifica un ENDSL .
Para obtener más información, consulte Operaciones de programación estructurada.
Operación SELECT sin un operando
- En el ejemplo siguiente:
- Si X es igual a 1, realice las operaciones siguientes a la primera sentencia WHEN* .
- Nota: No es necesaria ninguna operación de END antes de la siguiente operación de WHEN . El control pasa a la sentencia ENDSL .
- Si X NO es igual a 1, y si Y=2 y X<10, realice las operaciones siguientes a la segunda sentencia WHEN .
- Si ninguna condición es verdadera, realice las operaciones que siguen a la sentencia OTHER .
SELECT; WHEN X = 1; // 1 R = 1; // 1 S = 'A'; // 2 WHEN ((Y = 2) AND (X < 10)); // 3 R = 2; // 3 S = 'B'; OTHER; // 4 R = 3; // 4 S = 'C'; ENDSL; - El ejemplo siguiente muestra un grupo de selección con indicadores de condicionamiento. Después de la operación CHAIN, si el indicador 10 está activado, el control pasa a la operación ADD. Si el indicador 10 está desactivado, se procesa el grupo de selección.
*...1....+....2....+....3....+....4....+....5....+....6....+....7...+.... CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.... C KEY CHAIN FILE 10 C N10 SELECT C WHEN X = 1 * Sequence 1 C : C WHEN Y = 2 * Sequence 2 C : C ENDSL C ADD 1 N
Operación SELECT con un operando
- En el ejemplo siguiente:
- Todas las sentencias WHEN-IS y WHEN-IN realizan las comparaciones utilizando el valor de la expresión
family.child(c).pet(p).age. - Si
family.child(c).pet(p).agees igual a uno de los valores de la función incorporada %LIST , realice las operaciones siguientes a la sentencia WHEN-IN . - Nota: No se necesita ninguna operación de END antes de la siguiente WHEN-IS. El control pasa a la sentencia ENDSL .
- Si
family.child(c).pet(p).agees igual a 1, realice las operaciones siguientes a la sentencia WHEN-IS .Nota: Sifamily.child(c).pet(p).agetiene el valor 17, la primera comparación de WHEN-IN es verdadera, por lo que el control no alcanzaría esta sentencia. - Si
family.child(c).pet(p).ageestá entre 10 y 20, tal como especifica la función incorporada %RANGE , realice las operaciones siguientes a la sentencia WHEN-IN . - Si ninguna de las condiciones es verdadera, realice las operaciones siguientes a la sentencia OTHER .
DCL-DS family QUALIFIED; name VARCHAR(25); DCL-DS child DIM(10); name VARCHAR(25); age int(10): DCL-DS pets DIM(3); name VARCHAR(25); age int(10); END-DS: END-DS; END-DS; DCL-S c int(10); DCL-S p int(10); SELECT family.child(c).pet(p).age; // 1 WHEN-IN %LIST(2 : 5 : 17); / 2 R = 1; // 2 S = 'a'; // 3 WHEN-IS 1; // 4 R = 2; // 4 S = 'B'; WHEN-IN %RANGE(10 : 20); // 5 R = 3; // 5 S = 'C'; OTHER; // 6 R = 4; // 6 S = 'D'; ENDSL;Para obtener más ejemplos de la sentencia SELECT con un operando, consulte WHEN-IN (When the SELECT Operand is IN the WHEN-IN Operand) y WHEN-IS (When the SELECT Operand is Equal to the WHEN-IS Operand).
- Todas las sentencias WHEN-IS y WHEN-IN realizan las comparaciones utilizando el valor de la expresión