Permite realizar filtrado de datos en tablas virtuales. Es el equivalentea las condiciones where en los SQL tradicionales, es decir permite seleccionar registros de una tabla virtual filtrando por los valores de sus columnas.
Los filtros se escriben como expresiones regulares. La tabla virtual puede ser indicada mediante su nombre vía el atributo name o bien ser pasadacomo argumento.
La comparación entre la expresión regular y el dato correspondiente de la columna para cada registro, se realiza mediante la función java toString(). En general es una buena solución, pero puede que para campos decimales no funcione correctamente, debido a que el dato puede estar almacenado de forma diferente a como se indica en la expresión regular.
Cuando se desee filtrar por valores nulos de la columna, no hay que indicar el atributo regexp.
1 vtable.filter
<vtable.filter name='name'>
<column
name='name'
regexp='regexp'
/> +
<vtable /> ?
</vtable.filter>
Attributes | |||||
---|---|---|---|---|---|
Name | Type | Required | Default | Description | |
Aname | string | Nombre de la tabla virtual. La tabla virtual se puede indicar mediante este atributo o bien puede pasarse como un argumento. |
Arguments | |||||
---|---|---|---|---|---|
Name | Type | Required | Unique | Nullable | Description |
Ecolumn | Columna por la que filtrar. | ||||
Aname | string | Nombre de la columna. | |||
Aregexp | string | Expresión regular por la que se debe relizar el filtrado de datos para la columna.Este atributo no se debe indicar para los casos en los que se desee realizar búsquedas de valores nulos para la columnas, es decir, cuando se desea ralizar filtrado por valores nulos de la columna. | |||
Evtable | vtable | Tabla virtual de la que se desea filtrar registros. |
Returns | |
---|---|
Type | Description |
vtable | Retorna la nueva tabla virtual con los datos filtrados, es decir, con los registros de la tabla virtual origen que cumplían las condiciones de selección (de filtrado). |
Seleccionar registros de una tabla virtual filtrando por los valores de sus columnas.
<xsql-script name='vtable_filter_sample1'> <body> <vtable name='v_test'> <column name='codigo' type='char' unique='true' /> <column name='nombre' type='char' size='25' /> <column name='numero' type='integer' /> <column name='saldo' type='decimal' scale='2' /> </vtable> <vtable.insert name='v_test'> <column name='codigo'>A1</column> <column name='nombre'>Nombre A1</column> <column name='numero'>1</column> <column name='saldo'>123.4</column> </vtable.insert> <vtable.insert name='v_test'> <column name='codigo'>A2</column> <column name='nombre'>Nombre A2</column> <column name='numero'>2</column> <column name='saldo'>355.891</column> </vtable.insert> <vtable.insert name='v_test'> <column name='codigo'>A3</column> <column name='nombre'>Nombre A3</column> <column name='numero'>3</column> <column name='saldo'>10002020.891</column> </vtable.insert> <vtable.insert name='v_test'> <column name='codigo'>A4</column> <column name='nombre'>Nombre A4</column> <column name='numero'>4</column> <column name='saldo'><null /></column> </vtable.insert> <vtable.insert name='v_test'> <column name='codigo'>A5</column> <column name='nombre'>Ultimo A5</column> <column name='numero'>5</column> <column name='saldo'><null /></column> </vtable.insert> <!-- La tabla virtual con todos sus registros --> <!-- +......+.........+......+...........+ |codigo|nombre |numero|saldo | +......+.........+......+...........+ |A1 |Nombre A1| 1| 123.40| |A2 |Nombre A2| 2| 355.89| |A3 |Nombre A3| 3|10002020.89| |A4 |Nombre A4| 4| | |A5 |Ultimo A5| 5| | +......+.........+......+...........+ --> <println><v_test/></println> <!-- Seleccionar registros donde codigo es 'A3' --> <!-- +......+.........+......+...........+ |codigo|nombre |numero|saldo | +......+.........+......+...........+ |A3 |Nombre A3| 3|10002020.89| +......+.........+......+...........+ --> <println> <vtable.filter name='v_test'> <column name='codigo' regexp='A3' /> </vtable.filter> </println> <!-- Seleccionar registros donde el saldo 355.89. --> <!-- La escala tiene 2 dígitos, es importante ponerlo igual que --> <!-- el dato almacenado, o de lo contrario no encontrará el valor. --> <!-- +......+.........+......+......+ |codigo|nombre |numero|saldo | +......+.........+......+......+ |A2 |Nombre A2| 2|355.89| +......+.........+......+......+ --> <println> <vtable.filter name='v_test'> <column name='saldo' regexp='355.89' /> </vtable.filter> </println> <!-- Seleccionar registros donde el saldo es nulo. --> <!-- +......+.........+......+.....+ |codigo|nombre |numero|saldo| +......+.........+......+.....+ |A4 |Nombre A4| 4| | |A5 |Ultimo A5| 5| | +......+.........+......+.....+ --> <println> <vtable.filter name='v_test'> <column name='saldo' /> </vtable.filter> </println> <!-- Seleccionar registros cuyo nombre empieza por 'N'. --> <!-- +......+.........+......+...........+ |codigo|nombre |numero|saldo | +......+.........+......+...........+ |A1 |Nombre A1| 1| 123.40| |A2 |Nombre A2| 2| 355.89| |A3 |Nombre A3| 3|10002020.89| |A4 |Nombre A4| 4| | +......+.........+......+...........+--> <println> <vtable.filter name='v_test'> <column name='nombre' regexp='^N.*' /> </vtable.filter> </println> <!-- Seleccionar registros con numero = 2 o numero = 4 --> <!-- +......+.........+......+......+ |codigo|nombre |numero|saldo | +......+.........+......+......+ |A2 |Nombre A2| 2|355.89| |A4 |Nombre A4| 4| | +......+.........+......+......+ --> <println> <vtable.filter name='v_test'> <column name='numero' regexp='[24]' /> </vtable.filter> </println> </body> </xsql-script>
<xsql-script> <body> <vtable name='sales'> <column name='country' type='char' /> <column name='state' type='char' /> <column name='type' type='char' /> <column name='unitsales' type='integer' /> <column name='salescount' type='integer' /> </vtable> <vtable.insert name='sales'> <matrix> { 'USA' 'CA' 'Gourmet Supermarket' '21333' '6815' } { 'USA' 'CA' 'Small Grocery' '2117' '1325' } { 'USA' 'CA' 'Supermarket' '51298' '16302' } { 'USA' 'OR' 'Deluxe Supermarket' '41580' '13347' } { 'USA' 'OR' 'Supermarket' '26079' '8264' } { 'USA' 'WA' 'Deluxe Supermarket' '35257' '11184' } { 'USA' 'WA' 'Mid-Size Grocery' '11491' '3652' } { 'USA' 'WA' 'Small Grocery' '4440' '2719' } { 'USA' 'WA' 'Supermarket' '73178' '23229' } </matrix> </vtable.insert> <set name='v1'> <vtable.filter name='sales'> <column name='state' regexp='OR' /> </vtable.filter> </set> <set name='v2'> <vtable.filter name='sales'> <column name='state' regexp='C.*' /> </vtable.filter> </set> <println><sales /></println> <println><v1 /></println> <println><v2 /></println> <assert.equals><integer>2</integer><vtable.size><v1 /></vtable.size></assert.equals> <assert.equals><integer>3</integer><vtable.size><v2 /></vtable.size></assert.equals> </body> </xsql-script>