Este tema describe los elementos de las consultas de selección comunes utilizadas en ArcGIS. Las expresiones de consulta de ArcGIS utilizan la sintaxis de SQL.
Consultas comunes: buscar cadenas de caracteres
Las cadenas de caracteres siempre deben entrecomillarse en las consultas, por ejemplo:
STATE_NAME = 'California'
En las expresiones, las cadenas de caracteres distinguen entre mayúsculas y minúsculas. Si desea realizar una búsqueda que distinga entre mayúsculas y minúsculas, puede utilizar una función SQL para convertir todos los valores al mismo tipo de letra. En los orígenes de datos basados en archivo, como las geodatabases o los shapefiles, puede usar la función UPPER o LOWER para definir la combinación de mayúsculas y minúsculas de una selección. Por ejemplo, la siguiente expresión seleccionará el estado cuyo nombre esté almacenado como 'Rhode Island' o como 'RHODE ISLAND':
UPPER(STATE_NAME) = 'RHODE ISLAND'
Si la cadena de caracteres contiene una comilla simple, tendrá que usar otra comilla simple como carácter de escape. Por ejemplo:
NAME = 'Alfie''s Trough'
Utilice el operador LIKE (en lugar del operador =) para crear una búsqueda de cadena de caracteres parcial. Por ejemplo, esta expresión seleccionará Mississippi y Missouri entre los nombres de estados de Estados Unidos:
STATE_NAME LIKE 'Miss%'
El símbolo de porcentaje (%) significa que se acepta cualquier elemento en su lugar: un carácter, cien caracteres o ningún carácter. Alternativamente, si desea buscar con un comodín que represente un carácter, utilice un guión bajo (_). Por ejemplo, esta expresión serviría para buscar Catherine Smith y Katherine Smith:
OWNER_NAME LIKE '_atherine smith'
Puede utilizar los operadores mayor que (>), menor que (<), mayor o igual que (>=), menor o igual que (<=), distinto de (<>) y BETWEEN para seleccionar los valores de cadenas de caracteres según su orden. Por ejemplo, esta expresión seleccionará todas las ciudades en una cobertura con nombres que comienzan con las letras de M a Z:
CITY_NAME >= 'M'
Las funciones de cadena de caracteres se pueden utilizar para dar formato a las cadenas de caracteres. Por ejemplo, la función LEFT devolverá cierta cantidad de caracteres comenzando por la izquierda de la cadena de caracteres. En este ejemplo, la consulta devolverá todos los estados que comiencen con la letra A:
LEFT(STATE_NAME,1) = 'A'
Consulte la documentación de su sistema de administración de bases de datos para ver la lista de las funciones compatibles.
Expresiones comunes: buscar valores NULL
Puede utilizar la palabra clave NULL para seleccionar las entidades y los registros que tienen valores nulos para el campo que se especificó. La palabra clave NULL siempre está precedida por IS o IS NOT. Por ejemplo, si desea encontrar las ciudades para las que no se ha introducido la población de 1996, puede utilizar lo siguiente:
POPULATION IS NULL
Alternativamente, para encontrar las ciudades para las que se ha introducido la población de 1996, puede utilizar lo siguiente:
POPULATION96 IS NOT NULL
Expresiones comunes: buscar números
El punto decimal (.) se utiliza siempre como delimitador decimal, independientemente de la configuración local o regional. La coma no se puede usar como delimitador decimal o de miles en una expresión.
Puede consultar números con los operadores igual (=), no igual (<>), mayor que (>), menor que (<), mayor o igual que (>=), menor o igual que (<=) y BETWEEN. Por ejemplo:
POPULATION >= 5000
Se pueden utilizar las funciones numéricas para dar formato a los números. Por ejemplo, la función ROUND redondeará un número a una cantidad de decimales dada en una geodatabase de archivos:
ROUND(SQKM,0) = 500
Consulte la documentación de su sistema de administración de bases de datos para ver la lista de las funciones numéricas compatibles.
Fechas y hora
Reglas generales y expresiones comunes
Las fuentes de datos de geodatabase almacenan fechas en un campo de fecha y hora. Sin embargo, las coberturas de ArcInfo y los shapefiles no lo hacen. Por lo tanto, la mayor parte de la sintaxis de consultas detallada a continuación contiene una referencia a la hora. En algunos casos, la parte de la consulta sobre la hora se puede omitir de manera segura si se sabe que el campo contiene solo fechas; en otros casos, debe introducirse o la consulta devolverá un error de sintaxis.
La búsqueda en campos de fecha exige especial cuidado con la sintaxis necesaria para el origen de datos. Si crea una consulta de fecha en el modo Cláusula del Generador de consultas, se generará automáticamente la sintaxis correcta. El siguiente ejemplo muestra una consulta que devolverá todos los registros correspondientes o posteriores al 1 de enero de 2011 para una fuente de datos de geodatabase de archivos:
INCIDENT_DATE >= date '2011-01-01 00:00:00'
Nota:
Las fechas se almacenan en la base de datos subyacente como una referencia al 30 de diciembre de 1899, a las 00:00:00. Esto es válido para todas las fuentes de datos detalladas aquí.
El objetivo de esta sección es ayudarlo a consultar solo sobre valores de fecha, no de hora. Cuando se almacena una hora no nula con las fechas (por ejemplo, 12 de enero, 1999, 04:00:00), consultar solo sobre la fecha no devolverá el registro porque cuando pasa solo una fecha a un campo de fecha y hora, completará la hora con ceros y recuperará solo los registros en los que la hora es 12:00:00 a.m.
La tabla de atributos muestra la fecha y la hora en un formato amigable, según su configuración regional, en lugar del formato de la base de datos subyacente. Esto es positivo la mayoría de las veces, pero también tiene las siguientes desventajas:
- La cadena de caracteres que se muestra en la consulta SQL puede parecerse solo un poco al valor mostrado en la tabla, especialmente cuando está involucrada la hora. Por ejemplo, una hora introducida como 00:00:15 se mostrará como 12:00:15 a.m. en la tabla de atributos, con la configuración regional de Estados Unidos, y la sintaxis de consulta comparable será Datefield = '1899-12-30 00:00:15'.
- La tabla de atributos no sabe cuál es la fuente de datos subyacente hasta que se guardan las modificaciones. Primero intentará dar formato al valor introducido para que coincida con su propio formato; después, al guardar las modificaciones, intentará modificar el valor resultante para que se ajuste a la base de datos. Por este motivo, puede introducir una hora en un shapefile, pero comprobará que es descartado cuando guarda los cambios. El campo tendrá entonces un valor '1899-12-30' que se mostrará como 12:00:00 a.m. o algo equivalente dependiendo de la configuración regional.
Sintaxis de fecha y hora para geodatabases corporativas
Informix
Datefield = 'aaaa-mm-dd hh:mm:ss'
No se puede omitir la parte hh:mm:ss de la consulta, incluso si es igual a 00:00:00.
Oracle
Datefield = date 'aaaa-mm-dd'
Tenga en cuenta que no se devolverán registros donde la hora no sea nula.
A continuación se detalla un formato alternativo para consultar fechas en Oracle:
Datefield = TO_DATE('aaaa-mm-dd hh:mm:ss','AAAA-MM-DD HH24:MI:SS')
El segundo parámetro "AAAA-MM-DD HH24:MI:SS" describe el formato utilizado para las consultas. Una consulta real se verá de este modo:
Datefield = TO_DATE('2003-01-08 14:35:00','AAAA-MM-DD HH24:MI:SS')
Puede utilizar una versión más corta:
TO_DATE('2003-11-18','AAAA-MM-DD')
De nuevo, no se devolverán registros donde la hora no sea nula.
servidor SQL
Datefield = 'aaaa-mm-dd hh:mm:ss'
La parte hh:mm:ss de la consulta se puede omitir cuando la hora no está establecida en los registros.
El siguiente es un formato alternativo:
Datefield = 'mm/dd/aaaa'
IBM DB2
Datefield = TO_DATE('aaaa-mm-dd hh:mm:ss','AAAA-MM-DD HH24:MI:SS')
No se puede omitir la parte hh:mm:ss de la consulta, incluso si la hora es igual a 00:00:00.
PostgreSQL
Datefield = TIMESTAMP 'AAAA-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'AAAA-MM-DD'
Debe especificar la marca de tiempo completa cuando utiliza las consultas "igual a", o no se devolverán registros. Puede hacer consultas satisfactoriamente con las siguientes declaraciones si la tabla que consulta contiene registros de fecha con estas mismas marcas de tiempo (2007-05-29 00:00:00 ó 2007-05-29 12:14:25):
select * from table where date = '2007-05-29 00:00:00';
o
select * from table where date = '2007-05-29 12:14:25';
Si utiliza otros operadores, como "mayor que", "menor que", "mayor o igual que" o "menor o igual que", no tiene que designar la hora, aunque puede hacerlo si desea ser preciso. Funcionarán las dos declaraciones siguientes:
select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';
Geodatabases de archivos, shapefiles, coberturas y otras fuentes de datos basadas en archivos
Las fechas de las geodatabases de archivos, los shapefiles y las coberturas están precedidas por date.
Datefield = date 'aaaa-mm-dd'
Las geodatabases de archivos admiten el uso de una hora en el campo de fecha, por lo que puede agregarse lo siguiente a la expresión:
Datefield = date 'aaaa-mm-dd hh:mm:ss'
Los shapefiles y las coberturas no admiten el uso de la hora en un campo de fecha.
Nota:
Todos los SQL utilizados por la geodatabase de archivos están basados en el estándar SQL-92.
Limitaciones conocidas
La consulta de una fecha en la parte izquierda (primera tabla) de una unión solo funciona con las fuentes de datos basadas en archivos, como las geodatabases de archivos, los shapefiles y las tablas DBF. Sin embargo, existe una alternativa para trabajar con datos no basados en archivos, por ejemplo los datos corporativos, tal como se describe a continuación.
La consulta sobre una fecha en la parte izquierda de una unión será satisfactoria cuando se utilice la versión limitada de SQL desarrollada para las fuentes de datos basadas en archivos. Si no utiliza esa fuente de datos, puede forzar la expresión para que utilice este formato. Esto se puede lograr asegurándose de que la expresión de consulta incluya campos de más de una tabla de unión. Por ejemplo, si una clase de entidad y una tabla (FC1 y Table1) se unen y ambas proceden de una geodatabase corporativa, las siguientes expresiones fallarán o no devolverán ningún dato:
FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'
Para realizar una consulta satisfactoriamente, puede crearla de la siguiente manera:
FC1.date = date '01/12/2001' and Table1.OBJECTID > 0
Se utilizará la versión SQL limitada porque la consulta involucra campos de ambas tablas. En esta expresión, Table1.OBJECTID es siempre > 0 para los registros que coincidían durante la creación de la unión, por lo que esta expresión es verdadera para todas las filas que contienen coincidencias de unión.
Para asegurarse de que se seleccionan todos los registros con FC1.date = date "01/12/2001", utilice la siguiente consulta:
FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)
Esta consulta seleccionará todos los registros con FC1.date = date "01/12/2001", independientemente de si hubo una unión coincidente para cada registro en particular.
Combinar expresiones
Se pueden generar expresiones compuestas combinando las expresiones con los operadores AND y OR. Por ejemplo, la siguiente expresión selecciona todas las casas que tengan más de 1.500 pies cuadrados y un garaje para tres o más autos:
AREA > 1500 AND GARAGE > 3
Cuando se utiliza el operador OR, al menos una de las dos partes de la expresión separada por el operador OR debe ser verdadera para que se seleccione el registro. Por ejemplo:
RAINFALL < 20 OR SLOPE > 35
Utilice el operador NOT al comienzo de una expresión para buscar entidades o registros que no coincidan con la expresión especificada. Por ejemplo:
NOT STATE_NAME = 'Colorado'
Las expresiones con NOT se pueden combinar con AND y OR. Por ejemplo, esta expresión selecciona todos los estados de New England excepto Maine:
SUB_REGION = 'New England' AND NOT STATE_NAME = 'Maine'
Cálculos
Los cálculos se pueden incluir en las expresiones por medio de los operadores aritméticos +, -, * y /. Los cálculos se pueden realizar entre campos y números. Por ejemplo:
AREA >= PERIMETER * 100
Los cálculos también se pueden realizar entre campos. Por ejemplo, para buscar los países con una densidad de población menor o igual que 25 personas por milla cuadrada, podría utilizar esta expresión:
POP1990 / AREA <= 25
Jerarquía del operador
Las expresiones se evalúan de acuerdo con las reglas estándar de jerarquía del operador. Por ejemplo, la parte de una expresión entre paréntesis se evalúa antes que la parte que no está entre paréntesis.
HOUSEHOLDS > MALES * (POP90_SQMI + AREA)
Puede agregar paréntesis en modo de edición de SQL. Para ello, escríbalos o use los comandos Agrupar y Desagrupar del modo Cláusula con el fin de agregarlos o eliminarlos.
Subconsultas
Una subconsulta es una consulta anidada dentro de otra consulta, y solo es compatible con las fuentes de datos de la geodatabase. Se puede usar para aplicar funciones predicado o agregar o para comparar datos con los valores almacenados en otra tabla. Esto se puede hacer con la palabra clave IN o ANY. Por ejemplo, esta consulta seleccionará solo los países que no se incluyen también en la lista de la tabla indep_countries:
COUNTRY_NAME NOT IN (SELECT COUNTRY_NAME FROM indep_countries)
Nota:
Las coberturas, los shapefiles y otras fuentes de datos basadas en archivos que no sean de tipo geodatabase no admiten subconsultas. Las subconsultas que se realizan en tablas y clases de entidad corporativas versionadas no devolverán entidades almacenadas en las tablas delta. Las geodatabases de archivos proporcionan la compatibilidad limitada con la subconsultas que se explica en esta sección, mientras que las geodatabases corporativas proporcionan compatibilidad total. Para obtener más información sobre el conjunto completo de funciones de subconsultas de las geodatabases corporativas, consulte la documentación de su sistema de administración de bases de datos.
Esta consulta devolverá las entidades con un GDP2006 mayor que el GDP2005 de cualquiera de las entidades contenidas en los países:
"GDP2006" > (SELECT MAX("GDP2005") FROM countries)
La compatibilidad de las subconsultas en geodatabases de archivos se limita a lo siguiente:
- Subconsultas escalares con operadores de comparación. Una subconsulta escalar devuelve un solo valor, por ejemplo:
Para las geodatabases de archivos, las funciones establecidas AVG, COUNT, MIN, MAX, y SUM solo pueden utilizarse con subconsultas escalares."GDP2006" > (SELECT MAX("GDP2005") FROM countries)
- Predicado EXISTS, por ejemplo:
EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')
Operadores
A continuación se muestra la lista completa de operadores de consulta admitidos por las geodatabases de archivos, los shapefiles, las coberturas y otras fuentes de datos basadas en archivos. También son compatibles con las geodatabases corporativas, aunque estos orígenes de datos pueden requerir una sintaxis diferente. Además de los siguientes operadores, las geodatabases corporativas admiten otras funciones. Consulte la documentación de su sistema de administración de bases de datos para obtener más detalles.
Operadores aritméticos
Se utiliza un operador aritmético para sumar, restar, multiplicar y dividir valores numéricos.
Operador | Descripción |
---|---|
* | Operador aritmético para la multiplicación |
/ | Operador aritmético para la división |
+ | Operador aritmético para la suma |
- | Operador aritmético para la resta |
Operadores de comparación
Se utilizan operadores de comparación para comparar una expresión con otra.
Operador | Descripción |
---|---|
< | Menor que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. |
<= | Menor o igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. |
<> | No igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. |
> | Mayor que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. |
>= | Mayor o igual que. Se puede usar con cadenas (la comparación está basada en un orden alfabético), números y fechas. |
[NOT] BETWEEN x AND y | Selecciona un registro si tiene un valor mayor o igual que x y menor o igual que y. Cuando está precedido por NOT, selecciona un registro si tiene algún valor fuera del rango especificado. Por ejemplo, esta expresión selecciona todos los registros con un valor mayor o igual que 1 y menor o igual que 10:
Este es el equivalente de la siguiente expresión:
Sin embargo, la expresión con BETWEEN le brindará un mejor rendimiento si está consultando un campo indexado. |
[NOT] EXISTS | Devuelve TRUE si la subconsulta devuelve al menos un registro; de lo contrario, devuelve FALSE. Por ejemplo, esta expresión devuelve TRUE si el campo OBJECTID contiene un valor de 50:
EXISTS se admite solo en geodatabases corporativas y de archivos. |
[NOT] IN | Selecciona un registro si tiene una de varias cadenas o valores en un campo. Cuando está precedido por NOT, selecciona un registro si no tiene una de varias cadenas o valores en un campo. Por ejemplo, esta expresión busca cuatro nombres de estados diferentes: |
IS [NOT] NULL | Selecciona un registro si tiene un valor nulo para el campo especificado. Cuando NULL está precedido por NOT, selecciona un registro si tiene algún valor para el campo especificado. |
x [NOT] LIKE y [ESCAPE 'carácter de escape'] | Utilice el operador LIKE (en lugar del operador =) con comodines para crear una búsqueda de cadena de caracteres parcial. El símbolo de porcentaje (%) significa que se acepta cualquier elemento en su lugar: un carácter, cien caracteres o ningún carácter. Alternativamente, si desea buscar con un comodín que represente un carácter, utilice un guión bajo (_). Si necesita acceder a datos que no son de caracteres, utilice la función CAST. Por ejemplo, esta consulta devuelve números que empiezan con 8 del campo entero SCORE_INT:
Para incluir el símbolo de porcentaje o el guion bajo en la cadena de búsqueda, utilice la palabra clave ESCAPE para designar otro carácter en lugar del carácter escape, que a su vez indica que inmediatamente sigue un guion bajo o un signo de porcentaje real. Por ejemplo, esta expresión devuelve cualquier cadena que contenga 10%, como 10% DISCOUNT o A10%. |
Operadores lógicos
Operador | Descripción |
---|---|
AND | Combina dos condiciones y selecciona un registro si las dos condiciones son verdaderas. Por ejemplo, la siguiente expresión selecciona cualquier casa con más de 1.500 metros cuadrados y un garaje para más de dos autos:
|
O BIEN | Combina dos condiciones y selecciona un registro si al menos una condición es verdadera. Por ejemplo, la siguiente expresión selecciona cualquier casa con más de 1.500 metros cuadrados o un garaje para más de dos autos:
|
NOT | Selecciona un registro si no coincide con la expresión. Por ejemplo, la siguiente expresión selecciona todos los estados excepto California:
|
operadores de cadena de caracteres
Operador | Descripción |
---|---|
|| | Devuelve una cadena de caracteres que es el resultado de concatenar dos o más expresiones de cadena de caracteres.
|
Funciones
A continuación se muestra la lista completa de funciones admitidas por las geodatabases de archivos, los shapefiles, las coberturas y otras fuentes de datos basadas en archivos. Las geodatabases corporativas también admiten funciones, aunque estos orígenes de datos pueden requerir una sintaxis o un nombre de función diferente. Además de las siguientes funciones, las geodatabases corporativas admiten otras prestaciones. Consulte la documentación de su sistema de administración de bases de datos para obtener más detalles.
Funciones de fecha
Función | Descripción |
---|---|
CURRENT_DATE | Devuelve la fecha actual. |
EXTRACT(extract_field FROM extract_source) | Devuelve la porción extract_field de extract_source. El argumento extract_source es una expresión de fecha y hora. El argumento extract_field puede ser una de las siguientes palabras clave: YEAR, MONTH, DAY, HOUR, MINUTE o SECOND. |
CURRENT TIME | Devuelve la hora actual. |
Funciones de cadena
Los argumentos expresados como string_exp pueden ser el nombre de una columna, una cadena de caracteres literal o el resultado de otra función escalar, donde el tipo de datos subyacente se puede representar como un tipo de carácter.
Los argumentos expresados como character_exp son cadenas de caracteres de longitud variable.
Los argumentos expresados como start o length pueden ser literales numéricos o el resultado de otra función escalar, donde el tipo de datos subyacentes se puede representar como un tipo numérico.
Estas funciones de cadena de caracteres están basadas en 1; es decir, el primer carácter de la cadena de caracteres es el número 1.
Función | Descripción |
---|---|
CHAR_LENGTH(string_exp) | Devuelve la longitud en caracteres de la expresión de cadena. |
LOWER(string_exp) | Devuelve una cadena de caracteres equivalente a la de string_exp, con todos los caracteres en mayúsculas convertidos en minúsculas. |
POSITION(character_exp IN character_exp) | Devuelve la posición de la primera expresión de carácter en la segunda expresión de carácter. El resultado es un número exacto con una precisión definida por implementación y una escala de cero. |
SUBSTRING(string_exp FROM start FOR length) | Devuelve una cadena de caracteres derivada de string_exp, que comienza en la posición de carácter especificada por start y tiene length caracteres. |
TRIM(BOTH | LEADING | TRAILING trim_character FROM string_exp) | Devuelve string_exp con trim_character quitado del extremo inicial, del extremo final o de ambos extremos de la cadena. |
UPPER(string_exp) | Devuelve una cadena equivalente a la de string_exp, con todos los caracteres en minúsculas convertidos en mayúsculas. |
Funciones numéricas
Todas las funciones numéricas devuelven un valor numérico.
Los argumentos expresados como numeric_exp, float_exp o integer_exp pueden ser el nombre de una columna, el resultado de otra función escalar o un literal numérico, donde los tipos de datos subyacentes pueden representarse como un tipo numérico.
Función | Descripción |
---|---|
ABS(numeric_exp) | Devuelve el valor absoluto de numeric_exp. |
ACOS(float_exp) | Devuelve el arcocoseno de float_exp como un ángulo expresado en radianes. |
ASIN(float_exp) | Devuelve el arcoseno de float_exp como un ángulo expresado en radianes. |
ATAN(float_exp) | Devuelve el arco tangente de float_exp como un ángulo expresado en radianes. |
CEILING(numeric_exp) | Devuelve el entero más pequeño mayor o igual que numeric_exp. |
COS(float_exp) | Devuelve el coseno de float_exp, donde float_exp es un ángulo expresado en radianes. |
FLOOR(numeric_exp) | Devuelve el entero más grande menor o igual que numeric_exp. |
LOG(float_exp) | Devuelve el logaritmo natural de float_exp. |
LOG10(float_exp) | Devuelve el logaritmo de base 10 de float_exp. |
MOD(integer_exp1, integer_exp2) | Devuelve el restante de integer_exp1 dividido por integer_exp2. |
POWER(numeric_exp, integer_exp) | Devuelve el valor de numeric_exp a la potencia de integer_exp. |
ROUND(numeric_exp, integer_exp) | Devuelve numeric_exp redondeado a integer_exp lugares a la derecha del punto decimal. Si integer_exp es negativo, numeric_exp se redondea a |integer_exp| lugares a la izquierda del punto decimal. |
SIGN(numeric_exp) | Devuelve un indicador del signo de numeric_exp. Si numeric_exp es menor que cero, se devuelve -1. Si numeric_exp es igual a cero, se devuelve 0. Si numeric_exp es mayor que cero, se devuelve 1. |
SIN(float_exp) | Devuelve el seno de float_exp, donde float_exp es un ángulo expresado en radianes. |
TAN(float_exp) | Devuelve la tangente de float_exp, donde float_exp es un ángulo expresado en radianes. |
TRUNCATE(numeric_exp, integer_exp) | Devuelve numeric_exp truncado a integer_exp lugares a la derecha del punto decimal. Si integer_exp es negativo, numeric_exp se trunca a |integer_exp| lugares a la izquierda del punto decimal. |
La función CAST
La función CAST convierte un valor a un tipo de datos especificado. La sintaxis es la siguiente:
CAST(exp AS data_type)
El argumento exp puede ser el nombre de una columna, el resultado de otra función escalar o un literal. Data_type puede ser cualquiera de las siguientes palabras clave, que se pueden especificar en mayúsculas o minúsculas: CHAR, VARCHAR, INTEGER, SMALLINT, REAL, DOUBLE, DATE, TIME, DATETIME, NUMERIC o DECIMAL.